Перейти к содержимому
Compvision.ru
mrgloom

GDI affine transformation

Recommended Posts

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

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

cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);

   cvWarpPerspective( src, dst, warp_matrix );

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://msdn.microsoft.com/ru-ru/library/7e1w5dhw.aspx

а тут пишут что возможно,

Affine transformations include rotating, scaling, reflecting, shearing, and translating.

не очень понял что такое shearing.

и вообще как это все делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это же GDI+

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я не понимаю 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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);

   cvWarpPerspective( src, dst, warp_matrix );

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

еще вопрос возможно как то через 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+

Поделиться сообщением


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

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

вот есть функция, надо ее доделать. изменение 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();

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А чем вам вот это не нравится? Это и есть аналог 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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×