gpt4 book ai didi

带 RGB 16 位的 OpenCV

转载 作者:太空宇宙 更新时间:2023-11-03 22:35:02 26 4
gpt4 key购买 nike

我有一个 RGB 16 位格式的数据 (unsigned char*) R:5 G:6 B:5
如何将此数据设置为 IplImage 格式?
我可以从:

开始
unsigned char* data = ...data...;
IplImage *img = cvCreateImage(cvSize(800,480), IPL_DEPTH_8U, 3); // Should it be 16?
cvSetData(img,data,800*2); // Here is where I am not sure

最佳答案

您需要将 IPL_DEPTH_16U(单 channel )转换为 IPL_DEPTH_8U(三 channel )。

下面是我快速编写的一些代码(这应该可以工作,但我没有方便的 565 图像来测试它,所以我会先在一些测试图像上尝试...)

#include <opencv2/core/core.hpp>
#include <iostream>

using namespace std;
using namespace cv;

#define RED_MASK 0xF800
#define GREEN_MASK 0x07E0
#define BLUE_MASK 0x001F


int main(int argc, char* argv[])
{
IplImage *rgb565Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_16U, 1);
IplImage *rgb888Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_8U, 3);

unsigned short* rgb565Data = (unsigned short*)rgb565Image->imageData;
int rgb565Step = rgb565Image->widthStep / sizeof(unsigned short);

uchar* rgb888Data = (uchar*)rgb888Image->imageData;

float factor5Bit = 255.0 / 31.0;
float factor6Bit = 255.0 / 63.0;

for(int i = 0; i < rgb565Image->height; i++)
{
for(int j = 0; j < rgb565Image->width; j++)
{
unsigned short rgb565 = rgb565Data[i*rgb565Step + j];
uchar r5 = (rgb565 & RED_MASK) >> 11;
uchar g6 = (rgb565 & GREEN_MASK) >> 5;
uchar b5 = (rgb565 & BLUE_MASK);

// round answer to closest intensity in 8-bit space...
uchar r8 = floor((r5 * factor5Bit) + 0.5);
uchar g8 = floor((g6 * factor6Bit) + 0.5);
uchar b8 = floor((b5 * factor5Bit) + 0.5);

rgb888Data[i*rgb888Image->widthStep + j] = r8;
rgb888Data[i*rgb888Image->widthStep + (j + 1)] = g8;
rgb888Data[i*rgb888Image->widthStep + (j + 2)] = b8;
}
}

return 0;
}

您可能可以使用查找表进行转换来加快速度,但我所拥有的应该对指导性用途有好处。

另外,看看 this所以张贴进一步讨论这个话题。

关于带 RGB 16 位的 OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com