c++ - OpenCV - float 据类型和强度范围在 0-255 内的 RGB channel

标签 c++ opencv matrix

如何实现RGB channel 的值

  • float 据类型
  • 强度范围在 0-255 之间

我使用 CV_32FC4 作为矩阵类型,因为我将执行 float 学运算来实现道尔顿化。我期待强度范围与 CV_8UC3 中 RGB channel 的强度范围相同,只是具有不同的数据类型。但是当我打印矩阵时,我注意到 channel 的强度不在 0-255 范围内。我意识到这是由于 float 范围 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; 那样操作像素,然后将其分配回矩阵。

最佳答案

根据您的评论和其中的链接,我看到数据来自 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-255),如果您需要另一个范围(如 0-1),您可以输入比例因子。

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

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

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

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

关于c++ - OpenCV - float 据类型和强度范围在 0-255 内的 RGB channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47203498/

相关文章:

c++ - QuickSort 代码无法正常工作

python - 如何在OPENCV python中从图像中删除背景灰色图纸

python - 使用OpenCV-Python,如何有效地同时使用Python列表和Numpy数组?

python - 如何在 python 中使用矩阵的列表理解?

c++ - pipe inside (awk) cpp 中的系统命令

c++ - 单次运行时指针值的变化

c++ - 为什么 coroutine_handle.done 无法返回正确的结果?

python - 如何在 opencv-python 中将文本打印到框架

sql-server - "Automatic"将 SQL Server 表传输到 F# 矩阵

python - 在Python中将矩阵列表转换为仅一个2D矩阵