OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的相互转换就是经常需要做的。

首先分别来看看两种图片类的定义:

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;

Image:

        /**
* Construct an Image object with the specified arguments.
* Ownership of the image buffer is not transferred to the Image object.
* It is the user's responsibility to delete the buffer when it is
* no longer in use.
*
* @param rows Rows in the image.
* @param cols Columns in the image.
* @param stride Stride of the image buffer.
* @param pData Pointer to the image buffer.
* @param dataSize Size of the image buffer.
* @param format Pixel format.
* @param bayerFormat Format of the Bayer tiled raw image.
*/
Image(
unsigned int rows,
unsigned int cols,
unsigned int stride,
unsigned char* pData,
unsigned int dataSize,
PixelFormat format,
BayerTileFormat bayerFormat = NONE );

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

1. FlyCapture2 Image to OpenCV IplImage

IplImage* ConvertImageToOpenCV(Image* pImage)
{
IplImage* cvImage = NULL;
bool bColor = true;
CvSize mySize;
mySize.height = pImage->GetRows();
mySize.width = pImage->GetCols();
bool bInitialized = false;
Image colorImage;
switch ( pImage->GetPixelFormat() )
{
case PIXEL_FORMAT_MONO8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
bColor = false;
break;
case PIXEL_FORMAT_411YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_422YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_444YUV8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_RGB8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_MONO16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
bColor = false;
break;
case PIXEL_FORMAT_RGB16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_S_MONO16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
bColor = false;
break;
case PIXEL_FORMAT_S_RGB16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_16U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_RAW8: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_RAW16: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_MONO12: printf("Not supported by OpenCV");
bColor = false;
break;
case PIXEL_FORMAT_RAW12: printf("Not supported by OpenCV");
break;
case PIXEL_FORMAT_BGR: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_BGRU: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
case PIXEL_FORMAT_RGBU: cvImage = cvCreateImageHeader(mySize, , );
cvImage->depth = IPL_DEPTH_8U;
cvImage->nChannels = ;
break;
default: printf("Some error occured...\n");
return NULL;
} if(bColor) {
if(!bInitialized)
{
colorImage.SetData(new unsigned char[pImage->GetCols() * pImage->GetRows()*], pImage->GetCols() * pImage->GetRows()*);
bInitialized = true;
} pImage->Convert(PIXEL_FORMAT_BGR, &colorImage); //needs to be as BGR to be saved cvImage->width = colorImage.GetCols();
cvImage->height = colorImage.GetRows();
cvImage->widthStep = colorImage.GetStride(); cvImage->origin = ; //interleaved color channels cvImage->imageDataOrigin = (char*)colorImage.GetData(); //DataOrigin and Data same pointer, no ROI
cvImage->imageData = (char*)(colorImage.GetData());
cvImage->widthStep = colorImage.GetStride();
cvImage->nSize = sizeof (IplImage);
cvImage->imageSize = cvImage->height * cvImage->widthStep;
}
else
{
cvImage->imageDataOrigin = (char*)(pImage->GetData());
cvImage->imageData = (char*)(pImage->GetData());
cvImage->widthStep = pImage->GetStride();
cvImage->nSize = sizeof (IplImage);
cvImage->imageSize = cvImage->height * cvImage->widthStep; //at this point cvImage contains a valid IplImage
}
return cvImage;
}

2. OpenCV IplImage to FlyCapture2 Image

/**
* Convert OpenCV IplImage to FlyCapture2 Image type
*/
Image* ConvertIplImageToImage(IplImage* cvImage)
{
Image* pImage = new Image();
Error error;
BayerTileFormat btf = GBRG;
if (cvImage->depth == IPL_DEPTH_8U) {
if (cvImage->nChannels == ) error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, PIXEL_FORMAT_MONO8, btf);
if (cvImage->nChannels == ) error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, PIXEL_FORMAT_RGB8, btf);
if (cvImage->nChannels == ) error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, PIXEL_FORMAT_BGRU, btf);
} else if (cvImage->depth == IPL_DEPTH_16U) {
if (cvImage->nChannels == ) error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, PIXEL_FORMAT_MONO16, btf);
if (cvImage->nChannels == ) error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, PIXEL_FORMAT_RGB16, btf);
} else error = pImage->SetDimensions(cvImage->height, cvImage->width, cvImage->widthStep, UNSPECIFIED_PIXEL_FORMAT, btf);
if (error != PGRERROR_OK)
{
error.PrintErrorTrace();
return NULL;
} error = pImage->SetData((const unsigned char*)cvImage->imageData, cvImage->imageSize);
if (error != PGRERROR_OK)
{
error.PrintErrorTrace();
return NULL;
}
return pImage;
}

OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化的更多相关文章

  1. FlyCapture2 fc2Image OpenCV IplImage Conversion 两种图像格式之间的转换

    fc2Image是FlyCapture SDK的C语言库中的图片格式,由于在Windows上的MinGW无法编译FlyCapture2的C++库,只能使用C语言库,所以当我们在同时使用OpenCV的图 ...

  2. Convert between cv::Mat and QImage 两种图片类转换

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  3. 体验SRCNN和FSRCNN两种图像超分网络应用

    摘要:图像超分即超分辨率,将图像从模糊的状态变清晰. 本文分享自华为云社区<图像超分实验:SRCNN/FSRCNN>,作者:zstar. 图像超分即超分辨率,将图像从模糊的状态变清晰.本文 ...

  4. 09 Python两种创建类的方式

    第一种比较普遍的方式: class Work(): def __init__(self,name): self.name = name w = Work('well woker') 这样就简单创建了一 ...

  5. OpenCV在Debug和Release两种模式下布恩那个同时运行的问题

    首先,可以肯定的说,两者是可以随时切换进行运行的,若不能运行,必定是配置出了问题 以Debugx64和Releasex64为例: 在Releasex64模式下,我配置好了各种路径: 于是乎,我切换到D ...

  6. Selector、shape详解,注意这两种图像资源都以XML方式存放在drawable不带分辨率的文件夹中

    Selector.shape详解(一) Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> ...

  7. 基于OpenCV的火焰检测(一)——图像预处理

    博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...

  8. 两种简单实现菜单高亮显示的JS类(转载)

    两种简单实现菜单高亮显示的JS类   近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web ...

  9. IO知识点整理(四种基类的使用)

    一:介绍 1.两种基类 字节流 InputStream,OutputStream 字符流 Reader,Writer 二:字符流的基本方法(文字的处理比较常见) 1.Writer的API 2.File ...

随机推荐

  1. 基础知识《零》---Java程序运行机制及运行过程

    Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...

  2. annotation(@Retention@Target)详解

    一.注解:深入理解JAVA注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 1.元注解(meta-a ...

  3. oracle、mysql、sybase和sqlserver复制表结构和数据

    Sql Server(sybase): 1.复制表结构: 新建表student2,并且结构同表syn_xj_student一致.Sql语句如下: 2.复制表数据,并排除俩表中相同的数据: insert ...

  4. HDU 1003 Max Sum

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  5. Ubuntu安装steam游戏平台的解决方案

    steam是一个游戏平台,上面提供了很多收费和免费的游戏,在安装的过程中遇到了一些问题,所以把自己遇到的问题及解决方案分享出来供大家参考. 第一步:安装steam平台 sudo apt-get ins ...

  6. 【HTTP协议】响应头中的Content-Length和Transfer-Encoding

    来源: http://blog.csdn.net/superhosts/article/details/8737434 http://bbs.csdn.net/topics/390384017 对于h ...

  7. Android之UI控件

    本文主要包括以下内容 Spinner的使用 Gallery的使用 Spinner的使用 Spinner的实现过程是 1. 在xml文件中定义Spinner的控件 2. 在activity中获取Spin ...

  8. vm 负责虚拟机出现“”适配器 的mac地址在保留地址范围内‘’

    我自己在windows中文件中,直接将一个虚拟机进行复制了一份,后用vm打开, 选择我已经移到,结果会出现了一下的情况, 导致了我无法ping 通,故我看到一下提示: 原来是我两台虚拟机的MaC ,即 ...

  9. javascript字典数据结构常用功能实现

    必知必会啊. function Dictionary(){ var items = {}; this.has = function (key) { return key in items; }; th ...

  10. 在C# 6中实践模式匹配

    模式匹配(Pattern Matching)是F#中非常好用的一种语言特性.估计很多人都希望在C#中能用到这样的特性. 一句话解释一下模式匹配就是:创建一个函数可以接受和处理不同类型的表达式(包括不同 ...