C++ OpenCV为什么将Mat设置为小于1的小数点不会导致Mat中的所有值都变为0?

C++ OpenCV为什么将Mat设置为小于1的小数点不会导致Mat中的所有值都变为0?,c++,opencv,opencv3.1,C++,Opencv,Opencv3.1,我需要帮助弄清楚OpenCV如何处理将矩阵设置为某个值的问题 我有一个8位的垫子叫做Radiance,我想用它来色调贴图。下面是为我实现这一点的工作代码,K是常数450 cv::cvtColor(radiance, radiance, CV_BGR2XYZ); radiance = (K * radiance)/(1 + (K * radiance)); cv::cvtColor(radiance, radiance, CV_XYZ2BGR);` 这似乎不应该奏效,但确实奏效了。它将创建一个完

我需要帮助弄清楚OpenCV如何处理将矩阵设置为某个值的问题

我有一个8位的垫子叫做Radiance,我想用它来色调贴图。下面是为我实现这一点的工作代码,K是常数450

cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
radiance = (K * radiance)/(1 + (K * radiance));
cv::cvtColor(radiance, radiance, CV_XYZ2BGR);`
这似乎不应该奏效,但确实奏效了。它将创建一个完全色调映射的图像,看起来很棒。但是,如果尝试对单个像素执行此方法,则它们将成为介于0和1之间的十进制,这将截断为0。这里有一个例子-

cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
int x = radiance.at<cv::Vec3b>(500, 500)[0];
x = (K * x)/(1 + (K * x));
std::cout << x << "\n";

我理解为什么第二段代码会打印出一个零,但是第一部分中发生了什么,使它能够正确地对图像进行色调映射,我如何在单个像素级别上重新创建它?

你不能将辐射定义为浮点矩阵吗

Mat radiance(m, n, DataType<float>::type);
所以你可以买一个花车

cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
float x = radiance.at<cv::Vec3b>(500, 500)[0];
x = (K*x)/(1 + (K*x));
std::cout << x << "\n";

我认为OpenCV不会截断这些值,而是将它们四舍五入。。。至少在一次小测试中我做到了。。。在第二个测试中,尝试对x的赋值进行std::round或添加0.5,您可能会得到相同的结果
cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
float x = radiance.at<cv::Vec3b>(500, 500)[0];
x = (K*x)/(1 + (K*x));
std::cout << x << "\n";