如何实现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/