fc2Image是FlyCapture SDK的C语言库中的图片格式,由于在Windows上的MinGW无法编译FlyCapture2的C++库,只能使用C语言库,所以当我们在同时使用OpenCV的图像格式IplImage时,有时候就需要两种格式相互转换。如果需要FlyCapture2 Image和OpenCV IplImage之间的转换,可以参见我之前的博客OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化。我们先来分别看看两种图像格式的定义:

IplImage:

typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* Ignored by OpenCV */
int depth; /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */
char colorModel[]; /* Ignored by OpenCV */
char channelSeq[]; /* ditto */
int dataOrder; /* 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
int origin; /* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style). */
int align; /* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead. */
int width; /* Image width in pixels. */
int height; /* Image height in pixels. */
struct _IplROI *roi; /* Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI; /* Must be NULL. */
void *imageId; /* " " */
struct _IplTileInfo *tileInfo; /* " " */
int imageSize; /* Image data size in bytes
(==image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /* Pointer to aligned image data. */
int widthStep; /* Size of aligned image row in bytes. */
int BorderMode[]; /* Ignored by OpenCV. */
int BorderConst[]; /* Ditto. */
char *imageDataOrigin; /* Pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
}
IplImage;

fc2Image:

typedef struct _fc2Image
{
unsigned int rows;
unsigned int cols;
unsigned int stride;
unsigned char* pData;
unsigned int dataSize;
unsigned int receivedDataSize;
fc2PixelFormat format;
fc2BayerTileFormat bayerFormat; fc2ImageImpl imageImpl; } fc2Image;

下面我们来进行相互转换:

1. FlyCapture2 fc2Image OpenCV IplImage

/**
* Convert FlyCapture2 fc2Image to OpenCV IplImage type
*/
IplImage* ConvertFC2ImageToOpenCV(fc2Image* pImage)
{
IplImage* cvImage = NULL;
bool bColor = true;
CvSize mySize;
mySize.height = pImage->rows;
mySize.width = pImage->cols;
bool bInitialized = false;
fc2Image colorImage;
fc2Error error;
switch ( pImage->format )
{
case FC2_PIXEL_FORMAT_MONO8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
bColor = false;
break;
case FC2_PIXEL_FORMAT_411YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_422YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_444YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_RGB8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_MONO16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
bColor = false;
break;
case FC2_PIXEL_FORMAT_RGB16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_S_MONO16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
bColor = false;
break;
case FC2_PIXEL_FORMAT_S_RGB16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_RAW8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_RAW16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_MONO12: printf("Not supported by OpenCV");
bColor = false;
break;
case FC2_PIXEL_FORMAT_RAW12: printf("Not supported by OpenCV");
break;
case FC2_PIXEL_FORMAT_BGR: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_BGRU: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case FC2_PIXEL_FORMAT_RGBU: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
default: printf("Some error occured...\n");
return NULL;
} if(bColor) {
error = fc2CreateImage( &colorImage );
if ( error != FC2_ERROR_OK )
{
printf( "Error in fc2CreateImage: %d\n", error );
}
if(!bInitialized)
{
fc2SetImageData(&colorImage, (unsigned char*)malloc(sizeof(int) * pImage->cols * pImage->rows*), pImage->cols * pImage->rows*);
bInitialized = true;
}
fc2ConvertImageTo(FC2_PIXEL_FORMAT_BGR, pImage, &colorImage); //needs to be as BGR to be saved
if ( error != FC2_ERROR_OK )
{
printf( "Error in fc2ConvertImageTo: %d\n", error );
}
cvImage->width = colorImage.cols;
cvImage->height = colorImage.rows;
cvImage->widthStep = colorImage.stride;
cvImage->origin = ; //interleaved color channels
cvImage->imageDataOrigin = (char*)colorImage.pData; //DataOrigin and Data same pointer, no ROI
cvImage->imageData = (char*)(colorImage.pData);
cvImage->widthStep = colorImage.stride;
cvImage->nSize = sizeof (IplImage);
cvImage->imageSize = cvImage->height * cvImage->widthStep;
error = fc2DestroyImage(&colorImage);
if ( error != FC2_ERROR_OK )
{
printf( "Error in fc2CreateImaged: %d\n", error );
return -;
}
}
else
{
cvImage->imageDataOrigin = (char*)(pImage->pData);
cvImage->imageData = (char*)(pImage->pData);
cvImage->widthStep = pImage->stride;
cvImage->nSize = sizeof (IplImage);
cvImage->imageSize = cvImage->height * cvImage->widthStep;
}
return cvImage;
}

2. OpenCV IplImage to FlyCapture2 fc2Image

/**
* Convert OpenCV IplImage to FlyCapture2 fc2Image type
*/
fc2Image* ConvertIplImageToFC2Image(IplImage* cvImage)
{
fc2Image* pImage;
fc2Error error;
fc2BayerTileFormat btf = FC2_BT_GBRG;
error = fc2CreateImage(pImage);
if ( error != FC2_ERROR_OK )
{
printf( "Error in fc2CreateImage: %d\n", error );
}
if (cvImage->depth == IPL_DEPTH_8U) {
if (cvImage->nChannels == ) error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_PIXEL_FORMAT_MONO8, btf);
if (cvImage->nChannels == ) error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_PIXEL_FORMAT_RGB8, btf);
if (cvImage->nChannels == ) error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_PIXEL_FORMAT_BGRU, btf);
} else if (cvImage->depth == IPL_DEPTH_16U) {
if (cvImage->nChannels == ) error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_PIXEL_FORMAT_MONO16, btf);
if (cvImage->nChannels == ) error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_PIXEL_FORMAT_RGB16, btf);
} else error = fc2SetImageDimensions(pImage, cvImage->height, cvImage->width, cvImage->widthStep, FC2_UNSPECIFIED_PIXEL_FORMAT, btf);
if ( error != FC2_ERROR_OK )
{
printf( "Error in fc2SetImageDimensions: %d\n", error );
}
fc2SetImageData(pImage, (const unsigned char*)cvImage->imageData, cvImage->imageSize);
if (error != FC2_ERROR_OK)
{
printf( "Error in fc2SetImageData: %d\n", error );
}
return pImage;
}

FlyCapture2 fc2Image OpenCV IplImage Conversion 两种图像格式之间的转换的更多相关文章

  1. 【转】Notepad++中Windows,Unix,Mac三种格式之间的转换

    原文网址:http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_func_windows_unix_mac.ht ...

  2. OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化

    OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...

  3. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

  4. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  5. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  6. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  7. java源码——两种格式日期的转换

    这里要实现1981.07.30 格式和July 30.1981格式的日期的转换. 在输入时进行日期格式的识别,并且对字符串进行操作并且输出. 难点在于字符串格式的识别和月份的转换,我用了正则表达式匹配 ...

  8. C++四种类型之间的转换

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cas ...

  9. OpenCV图片拼接的两种方法

    https://my.oschina.net/xiaot99/blog/226589 一.原图 1.jpg                                        2.jpg   ...

随机推荐

  1. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

  2. iOS 网络请求中的challenge

    这里有一篇文章,请阅读,感谢作者!http://blog.csdn.net/kmyhy/article/details/7733619 当请求的网站有安全认证问题时,都需要通过 [[challenge ...

  3. VC++ TinyXML

    下载TinyXML库文件http://sourceforge.net/projects/tinyxml/ 在TinyXML的目录找到tinystr.h, tinyxml.h,tinystr.cpp,t ...

  4. NEFU 2016省赛演练一 F题 (高精度加法)

    Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...

  5. 手机/平板 连接局域网访问局域网电脑Web服务器进行移动端页面测试

    1.开启本地服务器(我用的是XAMPP) 2.查看本机IP Mac:点击左上角的苹果标志,选择系统偏好设置,弹出系统偏好设置面板-----点击网络,选择高级,切换到tcp/ip 选项卡 会看到本机IP ...

  6. 解决来QQ消息后歌曲音量降低问题

    今天学了一天,晚上听歌放松一下,谁知碰到了一个很纠结的问题,我正在聊天,每当来QQ消息后,我的歌曲音量自动降低,降到非常小,然后我就调高 音量,把音乐的音量调到最大,又把系统音量调到最大,谁知音乐的声 ...

  7. 思考探索,如何才能高效访问我的这个DataTable?

    需求 一切都是空的,除了Money,只有需求才是最真的,你懂的. 最近接到个略显棘手的需求,思索再三,想出两种方法,可觉得都不太好,这里与大家讨论一下. 需求如下: 用户需要在现有的某个grid中添加 ...

  8. Android控件系列之RadioButton&RadioGroup(转)

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  9. 【vijos1066】弱弱的战壕 线段树

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

  10. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

    25. 安装 Linux Malware Detect (LMD) Linux Malware Detect (LMD) 是 GNU GPLv2 协议下发布的开源 Linux 恶意程序扫描器,它是特别 ...