如何实现RGB通道的值
我使用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;
这样的像素,然后将其分配回矩阵。
答案 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 ++版本。这不在您在此处显示的代码中,而是在您链接的代码中。这个评论更多的是为了避免将来的头痛。