5

过去我使用 OpenCv 处理 32 位 .bmp 文件,并取得了成功的结果。如何利用 Opencv 函数处理12 位原始数据?我的处理将主要是诸如查找 1000 个像素之类的操作。

编辑 我得到的文件是 .bin 文件。并且图像中的像素是这样放置的(文件的所有内容都是这样的,因为我正在拍一张白纸):

(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)(FF)(0F)

显然我可以对此进行 16 位处理。

4

4 回答 4

4

好吧,我想对这张图片进行 16 位处理。这个秘密随后被另一个问题所吸引。

对于 16 位,我将不得不切换到 PNG 而不是 bmp!

该文档说我可以在 OpenCV 中使用 16 位 PNG

于 2012-06-18T17:14:03.107 回答
3

据我所知,OpenCV 只能正确处理 8、16 和 32 位图像。

取决于你想做什么,你应该

  • 您的 12 位图像转换为 8 位(假设它是 12 位拜耳编码图像)
  • 或通过用零填充值手动将其转换为 16。从我在这里找到的内容来看,这可能已经在您的图像上完成了。

我建议你在做任何事情之前仔细看看你的像素是如何准确地放置在你的图像中的。这将极大地帮助您了解什么是最好的。一个好方法是使用bless或其他十六进制编辑器

编辑:

取自这里,您的数据(我认为)编码为 16 位,并带有填充

只需使用 Opencv 从 16 位转换为 8 位就可以了,因为它是在转换为 JPEG 时所做的。你至少尝试过吗?

于 2012-06-18T08:23:47.840 回答
1

左移这些位并将它们存储为 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).

于 2020-10-04T11:10:11.633 回答
-1

OpenCV 没有任何功能支持 12 位数据。

将数据读取为“char”。3 个字符 = 2x12 位数据。该数据可以方便地转换为 16 位数据:

  1. 将 char1 左移 4 位并存储到 short1。
  2. 将其与 (char2 & 0xF0) 添加以获取 short1 中的前 12 位数据。
  3. 将 (char2 & 0x0F) 左移 8 位并存储到 short2。
  4. 将其与 char3 相加以获取 short2 中的下一个 12 位数据。
于 2012-06-18T08:37:28.063 回答