将OpenCV IplImage或Mat复制到Freeimage FIBITMAP中
我需要在FreeImage(FIBITMAP)和OpenCV格式(IplImage和/或Mat)之间交换数据。我对从FIBITMAP获取数据到IplImage或Mat很满意,因为FreeImage提供了一个函数FreeImage_GetScanLine,您可以将OPenCV imageData ptr设置为等于将OpenCV IplImage或Mat复制到Freeimage FIBITMAP中,opencv,freeimage,Opencv,Freeimage,我需要在FreeImage(FIBITMAP)和OpenCV格式(IplImage和/或Mat)之间交换数据。我对从FIBITMAP获取数据到IplImage或Mat很满意,因为FreeImage提供了一个函数FreeImage_GetScanLine,您可以将OPenCV imageData ptr设置为等于 然而,我一直在思考如何做相反的事情,也就是说,一旦我有了一个OpenCV图像,我如何将它的数据转换成一个FreeImage图像 如果您不介意复制,您可以为FIBITMAP创建一个IplI
然而,我一直在思考如何做相反的事情,也就是说,一旦我有了一个OpenCV图像,我如何将它的数据转换成一个FreeImage图像 如果您不介意复制,您可以为FIBITMAP创建一个
IplImage*
/cv::Mat
头,然后复制(使用opencv函数),如下所示:
cv::Mat src; // your source image
FIBITMAP whatever; // allocate space for your FIBITMAP here
cv::Mat wrapper(height, width, CV_8UC3, ptr_from_FIBITMAP, step);
src.copyTo(wrapper);
在复制数据指针时必须小心一点,很多图像格式都有填充来开始每一行,例如4字节的边界 如果您的图像具有GetScanLine()函数,则使用GetScanLine()返回的指针和cv::Mat的.ptr()成员创建一个空的plImage*/cv::Mat和memcopy每行可能更安全
cv::Mat &src
int srcRowBytes = width * src.elemSize();
for (int ih=0;ih<height;ih++) {
memcpy(dest.pointer_to_row(ih),src.ptr(ih),srcRowBytes);
}
cv::Mat&src
int srcRowBytes=width*src.elemSize();
对于(int ih=0;ih,这里有一个更详细的转换代码。这两个库中都有许多图像数据类型,我尝试支持最常见的类型。这假设您将cv::Mat作为源传递。FreeImage的视图透视图位于左下角
/* These are openCV types
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
*/
/* these are FI types
FIT_UNKNOWN = 0, // unknown type
FIT_BITMAP = 1, // standard image : 1-, 4-, 8-, 16-, 24-, 32-bit
FIT_UINT16 = 2, // array of unsigned short : unsigned 16-bit
FIT_INT16 = 3, // array of short : signed 16-bit
FIT_UINT32 = 4, // array of unsigned long : unsigned 32-bit
FIT_INT32 = 5, // array of long : signed 32-bit
FIT_FLOAT = 6, // array of float : 32-bit IEEE floating point
FIT_DOUBLE = 7, // array of double : 64-bit IEEE floating point
FIT_COMPLEX = 8, // array of FICOMPLEX : 2 x 64-bit IEEE floating point
FIT_RGB16 = 9, // 48-bit RGB image : 3 x 16-bit
FIT_RGBA16 = 10, // 64-bit RGBA image : 4 x 16-bit
FIT_RGBF = 11, // 96-bit RGB float image : 3 x 32-bit IEEE floating point
FIT_RGBAF = 12 // 128-bit RGBA float image : 4 x 32-bit IEEE floating point
*/
if(_dib) // get rid of the current dib.
FreeImage_Unload(_dib);
int width = src.size().width;
int height = src.size().height;
switch(src.type())
{
case CV_8U :{_dib = FreeImage_AllocateT(FIT_BITMAP,width, height, 8) ;}break; // 8 bit grayscale
case CV_8UC3:{_dib = FreeImage_AllocateT(FIT_BITMAP,width, height, 24);}break; // 24 bit RGB
case CV_16U :{_dib = FreeImage_AllocateT(FIT_UINT16,width, height, 16);}break; // 16 bit grayscale
case CV_16S :{_dib = FreeImage_AllocateT(FIT_INT16 ,width, height, 16);}break;
case CV_32S :{_dib = FreeImage_AllocateT(FIT_INT32 ,width, height, 32);}break;
case CV_32F :{_dib = FreeImage_AllocateT(FIT_FLOAT ,width, height, 32);}break;
case CV_64F :{_dib = FreeImage_AllocateT(FIT_DOUBLE,width, height, 32);}break;
default:ASSERT(FALSE);
}
if(_dib==NULL)
return FALSE;
int srcRowBytes = width * src.elemSize();
for (int ih=0;ih<height;ih++)
{
BYTE* ptr2Line = FreeImage_GetScanLine(_dib,(height-1)-ih);
memcpy(ptr2Line,src.ptr(ih),srcRowBytes);
}
_bHasChanged = TRUE;
return TRUE;
/*这些是openCV类型
#定义CV_8U 0
#定义CV_8S 1
#定义CV_16U 2
#定义CV_16S 3
#定义CV_32S 4
#定义CV_32F 5
#定义CV_64F 6
*/
/*这些是金融机构类型
FIT_UNKNOWN=0,//未知类型
FIT_BITMAP=1,//标准图像:1、4、8、16、24、32位
FIT_UINT16=2,//无符号短数组:无符号16位
FIT_INT16=3,//short的数组:有符号16位
FIT_UINT32=4,//无符号长数组:无符号32位
FIT_INT32=5,//长:有符号32位的数组
FIT_FLOAT=6,//浮点数组:32位IEEE浮点
FIT_DOUBLE=7,//双精度数组:64位IEEE浮点
FIT_COMPLEX=8,//FICOMPLEX数组:2 x 64位IEEE浮点
FIT_RGB16=9,//48位RGB图像:3 x 16位
FIT_RGBA16=10,//64位RGBA图像:4 x 16位
FIT_RGBF=11,//96位RGB浮点映像:3 x 32位IEEE浮点
FIT_RGBAF=12//128位RGBA浮点映像:4 x 32位IEEE浮点
*/
if(_dib)//去掉当前的dib。
FreeImage_卸载(_dib);
int width=src.size().width;
int height=src.size().height;
开关(src.type())
{
case CV_8U:{u dib=FreeImage_AllocateT(FIT_位图,宽度,高度,8)}break;//8位灰度
case CV_8UC3:{u dib=FreeImage_AllocateT(FIT_位图,宽度,高度,24)}break;//24位RGB
case CV_16U:{u dib=FreeImage_AllocateT(FIT_UINT16,宽度,高度,16)}break;//16位灰度
案例CV_16S:{u dib=FreeImage_AllocateT(FIT_INT16,width,height,16)}break;
案例CV_32S:{u dib=FreeImage_AllocateT(FIT_INT32,width,height,32)}break;
案例CV_32F:{u dib=FreeImage_AllocateT(FIT_FLOAT,width,height,32)}break;
案例CV_64F:{u dib=FreeImage_AllocateT(FIT_DOUBLE,width,height,32)}break;
默认值:断言(FALSE);
}
如果(_dib==NULL)
返回FALSE;
int srcRowBytes=width*src.elemSize();
对于(int ih=0;ih)两个IplImage
和cv::Mat
都有一个行步骤,正是出于这个原因(填充).是的,但是你能找出Freeebitmap在它的步进中使用的是什么吗?有一个函数FreeImage_GetPitch,它以字节为单位返回图像的宽度,与OpenCV的步进宽度相同。我很快会尝试这个,并让你们知道它是否成功。谢谢。