【问题标题】:OpenCV: Working with 12bit gray scale raw dataOpenCV:处理 12 位灰度原始数据
【发布时间】:2012-06-18 07:45:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: image image-processing opencv


    【解决方案1】:

    我想对这张图片进行 16 位处理。然后在another question 中发现这个秘密。

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

    This document 说我可以在 OpenCV 中使用 16 位 PNG

    【讨论】:

      【解决方案2】:

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

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

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

      编辑:

      Taken from here,您的数据(我认为)编码为 16 位,并带有填充

      使用 Opencv 简单地将 16 位转换为 8 位就可以解决问题,因为它是在转换为 JPEG 时所做的。 你至少尝试过吗?

      【讨论】:

      • 请参阅上面的编辑。您能否根据此信息修改您的解决方案?
      • 不,我不能,因为你的台词比你的问题更令人困惑。您至少确定自己在做什么,以及您的数据是如何编码的?
      【解决方案3】:

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

      您也可以使用制造商的 SDK 直接转换为 16 位,但我怀疑这会缩放位深度,而不是在某些情况下移动它。我宁愿保留原始位深度信息,因此自己进行转换可以防止我在切换制造商时不得不查看引擎盖(不幸的是,GigE 相机迫使您使用制造商 SDK)。

      【讨论】:

        【解决方案4】:

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

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

        1. 将 char1 左移 4 并存储到 short1。
        2. 与 (char2 & 0xF0) 相加得到short1 的前12 位数据。
        3. 将(char2 和 0x0F)左移 8 位并存储到 short2。
        4. 与char3相加,得到short2下一个12位数据。

        【讨论】:

        • 您确定数据不是 16 位或 32 位的吗?它似乎遵循 FF0F 模式。如果是 12 位,第一个像素将是 FF0,第二个像素:FFF,第三个像素 0FF 等根据您的信息!
        • NO ,我确定数据是 12 位的。数据实际上是对齐的:0FFF, 0FFF, 0FFF....
        • 不,我认为“0FFF”是 12 位,(忽略 0):1111 1111 1111。要清楚地显示它,我需要至少 16 位。
        • 啊..我的错误。我试图将其表示为 16 位。 12 位原始数据已经表示为 16 位。所以访问它们不会有问题吗?您可以使用与您已实现的 32 位图像代码类似的方式编写代码。由于 4 个 MSB 已经为 0,因此可以轻松计算像素总和。
        • 您能用一些示例数据详细说明您的算法吗?
        猜你喜欢
        • 2014-10-29
        • 2011-10-13
        • 2015-03-24
        • 2014-09-27
        • 2023-03-10
        • 2019-07-30
        • 2018-09-22
        • 1970-01-01
        • 2014-01-31
        相关资源
        最近更新 更多