过去我使用 OpenCv 处理 32 位 .bmp 文件,并取得了成功的结果。如何利用 Opencv 函数处理12 位原始数据?我的处理将主要是诸如查找 1000 个像素之类的操作。
编辑 我得到的文件是 .bin 文件。并且图像中的像素是这样放置的(文件的所有内容都是这样的,因为我正在拍一张白纸):
(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)
显然我可以对此进行 16 位处理。
过去我使用 OpenCv 处理 32 位 .bmp 文件,并取得了成功的结果。如何利用 Opencv 函数处理12 位原始数据?我的处理将主要是诸如查找 1000 个像素之类的操作。
编辑 我得到的文件是 .bin 文件。并且图像中的像素是这样放置的(文件的所有内容都是这样的,因为我正在拍一张白纸):
(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)
显然我可以对此进行 16 位处理。
据我所知,OpenCV 只能正确处理 8、16 和 32 位图像。
取决于你想做什么,你应该
我建议你在做任何事情之前仔细看看你的像素是如何准确地放置在你的图像中的。这将极大地帮助您了解什么是最好的。一个好方法是使用bless或其他十六进制编辑器
编辑:
取自这里,您的数据(我认为)编码为 16 位,并带有填充
只需使用 Opencv 从 16 位转换为 8 位就可以了,因为它是在转换为 JPEG 时所做的。你至少尝试过吗?
左移这些位并将它们存储为 16 位。
对于单色相机:
cv::Mat imgOpenCV = cv::Mat(cv::Size(img->width, img->height), CV_16UC1, (char*)img->imageData, cv::Mat::AUTO_STEP); //Convert the raw image
imgOpenCV.convertTo(imgOpenCV, CV_16UC1, 1.0*(2^4), 0.0); //Shift left 4 bits
对于彩色相机:
// Convert the image using the manufacturer's SDK (Imperx in this case)
IpxImage* imgConverted = nullptr;
IpxError err = IPX_CAM_ERR_OK;
IpxSize imgSize;
imgSize.height = img->height;
imgSize.width = img->width;
uint32_t pixelType = II_PIX_BGR12;
err = IpxCreateImage(&imgConverted, imgSize, pixelType);
err = IpxBayer_ConvertImage(hBayer, img, imgConverted);
// Create OpenCV converted image
cv::Mat imgOpenCV = cv::Mat(cv::Size(imgConverted->width, imgConverted->height), CV_16UC3, (char*)imgConverted->imageData, cv::Mat::AUTO_STEP); //Convert the image
imgOpenCV.convertTo(imgOpenCV, CV_16UC3, 1.0*(2^4), 0.0); //Shift left 4 bits
You could also use the manufacturer's SDK to convert to 16 bit directly, but I suspect this scales the bit depth instead of shifting it in some cases. I'd rather preserve the raw bit depth information, so doing the shift myself prevents me from having to look under the hood when I switch manufacturers (GigE cameras force you to use the manufacturer SDK unfortunately).
OpenCV 没有任何功能支持 12 位数据。
将数据读取为“char”。3 个字符 = 2x12 位数据。该数据可以方便地转换为 16 位数据: