OpenCV用像素指针构建图像

Posted

技术标签:

【中文标题】OpenCV用像素指针构建图像【英文标题】:OpenCV build an image with pixel Pointer 【发布时间】:2017-03-06 09:01:17 【问题描述】:

我正在尝试将 OpenCV 程序实施到现有程序中。在这个程序中,相机捕捉到图像,我可以通过指向图像第一个像素的指针访问该图像。 我现在的问题是,如何根据 OpenCV 可以使用的信息(指向图像的第一个像素、宽度和高度的指针)构建图像。

我希望我的问题描述得足够清楚。

你有什么想法吗?

     cv::Mat aCameraImage = cv::Mat(cv::Size(getImageWidth(), getImageHeight()), CV_8UC1, getImageDataPtr());

     if (!aCameraImage.empty())
     
       cv::imshow("Camera Image", aCameraImage);
       cv::waitKey(100);
     

     for(int i = 0; i<aCameraImage.cols; i++ )
     
        for(int j = 0; j<aCameraImage.rows; j++ )
        
            std::cout << aCameraImage.at<uchar>(i,j) << " ";
        
        std::cout << std::endl;
     

【问题讨论】:

cv::Mat 有一个接受外部数据的构造函数。使用 cv::Mat(cv::Size(width, height), yourPixelType, pointerToYourData);如果您的图像是没有 alpha 通道的 8 位 RGB 或 BGR 图像,则 yourPixelType 很可能是 CV_8UC3。 如果在每一行的末尾有一个额外的填充(通常用于优化),那么还有另一个构造函数。 非常感谢您的快速回复!!!所以现在我得到一个显然不是空的垫子。但是我的图像全是黑色的:-/ 但我认为这是我的代码的问题。所以谢谢你的解决方案:-) 您从相机中得到了什么样的指针?是unsigned char* 还是别的什么?!? 【参考方案1】:

有一个 SDK,我猜你正在使用它。 你会创建这样的结构吗?

IMAGE_INFO *ImageInfo = new IMAGE_INFO; 
ImageInfo->ImageData  = Image_getDataPointer(Image); 
ImageInfo->SizeX      = Image_getSizeX(Image); 
ImageInfo->SizeY      = Image_getSizeY(Image); 
ImageInfo->PixelType  = Image_getPixelType(Image); 
ImageInfo->ImageID    = Image_getImageID(Image); 

SDK 表示相机可能会提供 12 位编码图像。请检查PixelType并告诉我它是什么。

enum   GVSP_PIXEL_TYPE  
   GVSP_PIX_UNKNOWN = 0x0000, 
   GVSP_PIX_MONO8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT | 0x0001),
   GVSP_PIX_MONO10 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0003), 
   GVSP_PIX_MONO10_PACKED = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY12BIT | 0x0004), 
   GVSP_PIX_MONO12 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0005),
   GVSP_PIX_MONO12_PACKED = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY12BIT | 0x0006), 
   GVSP_PIX_MONO16 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0007), 
   GVSP_PIX_BAYGR8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT | 0x0008), 
   GVSP_PIX_BAYRG8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT | 0x0009), 
   GVSP_PIX_BAYGB8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT | 0x000A),
   GVSP_PIX_BAYBG8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT | 0x000B), 
   GVSP_PIX_BAYGR10 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x000C),
   GVSP_PIX_BAYRG10 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x000D), 
   GVSP_PIX_BAYGB10 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x000E), 
   GVSP_PIX_BAYBG10 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x000F), 
   GVSP_PIX_BAYGR12 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0010), 
   GVSP_PIX_BAYRG12 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0011), 
   GVSP_PIX_BAYGB12 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0012), 
   GVSP_PIX_BAYBG12 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY16BIT | 0x0013), 
   GVSP_PIX_RGB24 = (GVSP_PIX_RGB | GVSP_PIX_OCCUPY24BIT), 
   GVSP_PIX_GRAY8 = (GVSP_PIX_MONO | GVSP_PIX_OCCUPY8BIT) 
  

您可以使用一些提供的函数来转换图像:

Image_getImage12bitAs8bit(Camera, Buffer8bit, BufferLength); 
Image_getImage12bitAs16bit(Camera, Buffer16bit, BufferLength); 
//Image_getImage16bitAs8bit(Camera, Buffer8bit, BufferLength); 

之后你可以使用CV_8UC1CV_16UC1

您能否进一步提供这些函数的结果?

StreamingChannel_getPixelType() StreamingChannel_getBufferData() StreamingChannel_getBufferSize() StreamingChannel_getImagePitch() StreamingChannel_getImageSizeX() StreamingChannel_getImageSizeY()

【讨论】:

哦,非常感谢您的帮助!!!所以我的 PixelType 是 GVSP_PIX_MONO8 Camera_getPitch(): 1392 Camera_getSizeX(): 1392 在现有的程序中,不同的变量名称为 Heigth 和 Width 并且愚蠢地我拿错了一个:-/ 现在一切正常。再来一次 ;-) : 非常感谢您的帮助!!!

以上是关于OpenCV用像素指针构建图像的主要内容,如果未能解决你的问题,请参考以下文章

用opencv如何提取像素点的RGB分量

opencv 访问图像像素的三种方式

opencv之访问图像像素

opencv学习笔记访问图像中像素的三种方式ROI区域图像叠加和图像混合

opencv怎么将图像数据存入矩阵

怎么用opencv2.0将图像大小改变到指定像素?