OpenCV - 浮点数据类型和强度范围内的RGB通道0-255

时间:2017-11-09 13:46:31

标签: c++ opencv matrix

如何实现RGB通道的值

  • 浮动数据类型
  • 强度范围在0-255
  • 之内

我使用CV_32FC4作为矩阵类型,因为我将执行浮点数学运算来实现Daltonization。我期望强度范围与CV_8UC3中RGB通道的强度范围相同,只是具有不同的数据类型。但是当我打印矩阵时,我注意到通道的强度不在0-255之间。我意识到这是由于浮动范围matrix type

Mat mFrame(height, width, CV_32FC4, (unsigned char *)pNV21FrameData);

for(int y = 0 ; y < height ; y++){
    for(int x = 0 ; x < width ; x++){
        Vec4f BGRA = mFrame.at<Vec4f>(y,x);
        // Algorithm Implementation

        mFrame.at<Vec4f>(y,x) = BGRA;
    }
}

Mat mResult;
mFrame.convertTo(mResult, CV_8UC4, 1.0/255.0);

我需要操纵像BGRA[0] = BGRA[0] * n;这样的像素,然后将其分配回矩阵。

1 个答案:

答案 0 :(得分:1)

根据您的评论及其中的链接,我看到数据来自BGRA。数据在uchar中。

我从这一行开始假设:

Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels);

要解决此问题,您可以创建矩阵,然后将其转换为float。

Mat mFrame(height, width, CV_8UC4, (unsigned char *)pNV21FrameData);
Mat mFloatFrame;
mFrame.convertTo(mFloatFrame, CV_32FC4);

请注意,如果您需要另一个(如0-1),这将保留当前范围(0-255),您可以放置​​比例因子。

最后你可以转换回来,但要注意这个函数是saturate_cast。如果您想要管理溢出或小数的特定方式,则必须在转换之前执行此操作。

Mat mResult;
mFloatFrame.convertTo(mResult, CV_8UC4);

请注意,1.0/255.0不存在,因为数据已经在0-255范围内(至少在操作之前)。

最后一条评论,评论中的链接使用IplImage和其他旧的C(已弃用)版本的OpenCv。如果您使用的是c ++,请坚持使用像Mat这样的c ++版本。这不在您在此处显示的代码中,而是在您链接的代码中。这个评论更多的是为了避免将来的头痛。