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. javascript 布尔类型值判断

    javascript中,值非null的对象在if()中都会被判断为true: if([]) {// true} if({}) {// true} if(null) {// false} if(&quo ...

  2. 【转】tomcat下部署 solr 5.3.1

    本文转自:http://blog.csdn.net/lianghyan/article/details/49467207 solr下载: http://lucene.apache.org/solr/d ...

  3. Android的Observable和iOS的NotificationCenter

    使用起来很类似,参看以下网址http://stackoverflow.com/questions/10327200/equivalent-of-ios-nsnotificationcenter-in- ...

  4. Java for LeetCode 198 House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  5. 快速排序模板qsort(转载)

     qsort  用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各 ...

  6. codeforces A. The Wall 解题报告

    题目链接:http://codeforces.com/problemset/problem/340/A 这道题目理解不难,就是在[a, b]区间内,找出同时能够被x和y整除的个数.第一次想当然的开了两 ...

  7. sublime快捷键整理

    快捷键 功能 ctrl+shift+n 打开新Sublime ctrl+shift+w 关闭Sublime,关闭所有打开文件 ctrl+shift+t 重新打开最近关闭文件 ctrl+n 新建文件 c ...

  8. linux_command_撷叏命令: cut, grep

    [root@www ~]# cut -d'分隑字符' -f fields <==用亍有特定分隑字符[root@www ~]# cut -c 字符区间<==用亍排列整齐癿讯息选项不参数:-d ...

  9. Android客户端与服务器之间传递json数据

    在服务器与客户端之间通信,json数据是一种常用格式,本文主要在服务器端构建数据,在客户端接收显示,并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 ...

  10. hadoop之快照

    在hadoop第前几个版本中是没有快照功能的,2.x中是有这个特性的 Hadoop 2.x HDFS新特性   HDFS快照 HDFS快照     在2.x终于实现了快照     设置一个目录为可快照 ...