OpenCV:使用12位灰度原始数据

时间:2012-06-18 07:45:53

标签: image image-processing opencv

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

修改 我得到的文件是.bin文件。图像中的像素就像这样放置(文件中包含所有这样的内容,因为我正在拍白皮书):

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

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

4 个答案:

答案 0 :(得分:3)

我想在这张图片上进行16位处理。然后秘密被another question所揭示。

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

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

答案 1 :(得分:2)

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

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

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

编辑:

Taken from here,您的数据(我认为)使用填充<16>编码为16位

使用Opencv简单地从16位转换为8位应该可以解决问题,就像转换为JPEG时所做的那样。 你至少试过吗?

答案 2 :(得分:0)

OpenCV的任何功能都不支持12位数据。

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

  1. 左移char1乘4并存储到short1。
  2. 添加(char2&amp; 0xF0)以获取short1中的前12位数据。
  3. 左移(char2&amp; 0x0F)乘以8并存储到short2。
  4. 使用char3添加它以获取short2中的下一个12位数据。

答案 3 :(得分:0)

将这些位左移并存储为16bit。

对于黑白相机:

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)。