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_8UC1
或CV_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用像素指针构建图像的主要内容,如果未能解决你的问题,请参考以下文章