Jump to content
Compvision.ru
Sign in to follow this  
mrgloom

GDI affine transformation

Recommended Posts

есть возможность сделать афинное преобразование через GDI?

что то типа по координатам углов на 1 изображении (srcQuad) преобразует в новое изображение с координатами dstQuad.

cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);

   cvWarpPerspective( src, dst, warp_matrix );

Share this post


Link to post
Share on other sites

Это же GDI+

Тормознутый и неприжившийся. Именно эту возможность можно использовать только из C#

Share this post


Link to post
Share on other sites

Я на GDI тоже обижен :thumbsd: в топку его!

А вот хотелось бы узнать какими библиотеками, кроме OpenCV можно совершить аффинные/перспективные преобразования.

Share this post


Link to post
Share on other sites

Я на GDI тоже обижен :thumbsd: в топку его!

А вот хотелось бы узнать какими библиотеками, кроме OpenCV можно совершить аффинные/перспективные преобразования.

Про OpenGL не думали? :)

Share this post


Link to post
Share on other sites

Про OpenGL не думали? :)

Даже не брался за это дело ... давно хотел, но все как-то времени нету :geek: Теперь будет повод :)

Share this post


Link to post
Share on other sites

я не понимаю HBITMAP достаточно чтобы проводить все манипуляции над изображением?(т.е. вывести его, сохранить на диск, получить доступ к пикселям).

Share this post


Link to post
Share on other sites

Я бы на твоём месте не заморачивался с GDI. OpenGL или DirectX по степени сложности освоения находятся на схожем уровне, но предоставляют в разы больше возможностей. Проверено не только моим опытом.

Share this post


Link to post
Share on other sites

я не понимаю HBITMAP достаточно чтобы проводить все манипуляции над изображением?(т.е. вывести его, сохранить на диск, получить доступ к пикселям).

аффинные/перспективные преобразования и доступ к пикселям/сохранение это не одно и то-же.

http://ru.wikibooks.org/wiki/%D0%90%D1%84%D1%84%D0%B8%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

Share this post


Link to post
Share on other sites
аффинные/перспективные преобразования и доступ к пикселям/сохранение это не одно и то-же.

ну и это были 2 разных вопроса.

GDI уже в проекте есть, так что я выбирать не могу.

у меня есть функции перевода IplImage* to HBITMAP и обратно, и я пытаюсь понять достаточно ли HBITMAP для манипулирования изображением?

и еще вопрос если я например вывожу изображение в прямоугольник, то чтобы сжимать\растягивать и изменять размеры, мне не надо менять само изображение и перезагружать его, а меняется только способ как оно выводится?

Share this post


Link to post
Share on other sites

ну и это были 2 разных вопроса.

GDI уже в проекте есть, так что я выбирать не могу.

у меня есть функции перевода IplImage* to HBITMAP и обратно, и я пытаюсь понять достаточно ли HBITMAP для манипулирования изображением?

Тогда вот: http://msdn.microsoft.com/en-us/library/ms536395.aspx

Share this post


Link to post
Share on other sites

там только Scale,Translate,Rotate.

мне же нужно из прямоугольного изображения получить трапецию.

собираюсь делать с помощью opencv

cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);

   cvWarpPerspective( src, dst, warp_matrix );

и грузить картинку через GDI

Share this post


Link to post
Share on other sites

еще вопрос возможно как то через GDI отрисовывать только часть изображения, что то типа ROI в opencv?

Share this post


Link to post
Share on other sites

еще вопрос возможно как то через GDI отрисовывать только часть изображения, что то типа ROI в opencv?



int GetBufferFromImage(PixelFormat pixFormat, int channelsCount, Gdiplus::Rect *region, byte *&buffer)

{

	GdiUserInfo.imageWidth = GdiUserInfo.image->GetWidth();


	UINT pixelsCount = region->Width * region->Height;

	UINT bitsPP = GetPixelFormatSize(pixFormat); // количество бит/пиксель

	UINT bytePP = bitsPP / channelsCount; // размерность одного канала

	UINT bufferSize = pixelsCount*bytePP;


	BitmapData *data = new BitmapData();

	GdiUserInfo.image->LockBits(region, ImageLockModeRead, pixFormat, data);


	buffer = new byte[data->Stride*data->Height];

	memcpy(buffer, data->Scan0, data->Stride*data->Height);


	GdiUserInfo.image->UnlockBits(data);


	delete[] data;

	delete[] GdiUserInfo.image;


	return 0;

}

Выкопал из своих старых проектов (всего месяца полтора прошло, а уже - старый :rolleyes: ) сие чудо - не тестировал, но вроде должно работать ... Запись осуществляется так же, только ImageLockModeWrite

P.S. Буфер на выходе содержит данные из интересующего вас региона

P.P.S. А было бы неплохо создать отдельную ветку на форуме именно по GDI+

Share this post


Link to post
Share on other sites
P.P.S. А было бы неплохо создать отдельную ветку на форуме именно по GDI+

Нет проблем :)

  • Like 1

Share this post


Link to post
Share on other sites

Нет проблем :)

Спасибо! Теперь главное, чтобы ув. мистер Глум :huh: нашел свою темку :lol:

Share this post


Link to post
Share on other sites

мало понял выложенный код.

вот есть функция, надо ее доделать. изменение rc, похоже не дает нужного результата, т.к. изображение просто полностью в него вписывается(а мне надо например выделить из прямоугольного изображение его часть), получается надо изменять my_Bitmap.Bitmap()? или есть какой то еще способ вывести?

void DrawImage( CDC& dc ,Rect rc,my_struct my_Bitmap )

{

CDC srcDC;

srcDC.CreateCompatibleDC(NULL);

int oldMode = dc.SetStretchBltMode(COLORONCOLOR);

HBITMAP oldBitmap = (HBITMAP)srcDC.SelectObject(my_Bitmap.Bitmap());

dc.StretchBlt(rc.left, rc.top,

rc.Width(), rc.Height(),

&srcDC,

0, 0, my_Bitmap.Width(), abs(my_Bitmap.Height()),

SRCCOPY);

dc.SetStretchBltMode(oldMode);

srcDC.SelectObject(oldBitmap);

srcDC.DeleteDC();

}

Share this post


Link to post
Share on other sites

А чем вам вот это не нравится? Это и есть аналог cvSetImageROI()



GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


	Gdiplus::Bitmap *image = new Gdiplus::Bitmap(L"D:\\gia.jpg");

	UINT channelsCount = 3; // не помню как в GDI+ получить количество каналов изображения 


	Rect *region = new Rect(0, 0, 200, 200);


	UINT pixelsCount = region->Width * region->Height;

	UINT bitsPP = GetPixelFormatSize(PixelFormat24bppRGB); // количество бит/пиксель


	UINT bytePP = bitsPP / channelsCount; // размерность одного канала

	UINT bufferSize = pixelsCount*bytePP;


	BitmapData *data = new BitmapData();

	image->LockBits(region, ImageLockModeRead, PixelFormat24bppRGB, data);


	int widthStep = data->Stride;


	byte *buffer = new byte[data->Stride*data->Height];

	memcpy(buffer, data->Scan0, data->Stride*data->Height);


	image->UnlockBits(data);


	delete[] data;

	delete[] image;


	StopGDIPlusSystem();


	IplImage *img = cvCreateImage(cvSize(region->Width, region->Height), 8, 3);

	cvSetImageData(img, buffer, widthStep);


	cvShowImage("TEST", img);

	cvWaitKey();



[/code]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×