use*_*018 5 c++ opencv image-processing computer-vision mat
我在将图像采集卡中的图像数据解析为 OpenCV Mat 格式时遇到问题。我可以从 EDT 图像采集卡获取图像数据作为无符号字符指针,并将其传递给新创建的 Mat,但我在此过程中丢失了有价值的数据,并且不确定如何修复它。
我的相机是红外相机,输出 12 位 320x256 拜耳图像。我相当有信心我对 EDT API 的使用是正确的。使用 EDT 的软件“pdvshow”,我可以按预期查看图像数据,但是当我将 EDT API 返回的帧转换为 OpenCV Mat 并显示它时,我丢失了大量数据。当我将 Mat 设置为 CV16UC1 时,帧接近黑色,当 Mat 设置为 CV8UC1 时,帧显示大部分数据,但显得非常颗粒化,并且一些点完全被吹掉。我知道图像采集卡将每个 12 位像素存储在两个字节中,并且数据是 MSB 对齐的。GetStride 返回 0。
unsigned char *pdvImage;
pdvImage = pdv_image(pdv_p);
cv::Mat freshFrame;
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_16UC1, pdvImage, GetStride()); //was CV_16UC1 but 8UC1 shows more data
return freshFrame.clone();
Run Code Online (Sandbox Code Playgroud)
当您创建freshFrameCV_16UC1 Mat 时,12 位数据位于最低有效位。缩放数据将解决生成的图像显得太黑的问题。所以而不是
return freshFrame.clone();
Run Code Online (Sandbox Code Playgroud)
你需要
return freshFrame * 16;
Run Code Online (Sandbox Code Playgroud)
您可能还需要检查 中每个像素的两个字节的字节顺序pdvImage。
对于 CV_8UC1 这不起作用
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_8UC1, pdvImage, GetStride());
Run Code Online (Sandbox Code Playgroud)
因为前两个字节pdvImage组成了图像中第一个像素的值,但在 freshFrame 中成为两个单独的像素。但是,如果您freshFrame按照上面的行进行创建,则第一个字节将成为第一个像素的值freshFrame,第二个字节将成为第二个像素的值,依此类推。显然这是错误的。如果您确实需要 CV_8UC1 Mat,最简单的方法可能是创建 CV_16UC1 Mat,然后对其进行转换。