Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将OpenCV IplImage或Mat复制到Freeimage FIBITMAP中_Opencv_Freeimage - Fatal编程技术网

将OpenCV IplImage或Mat复制到Freeimage FIBITMAP中

将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

我需要在FreeImage(FIBITMAP)和OpenCV格式(IplImage和/或Mat)之间交换数据。我对从FIBITMAP获取数据到IplImage或Mat很满意,因为FreeImage提供了一个函数FreeImage_GetScanLine,您可以将OPenCV imageData ptr设置为等于


然而,我一直在思考如何做相反的事情,也就是说,一旦我有了一个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的步进宽度相同。我很快会尝试这个,并让你们知道它是否成功。谢谢。