Aly*_*Aly 22 c++ opencv visualization depth kinect
我正在使用一个数据集,其中包含图像,其中每个像素是一个16位无符号int,以mm为单位存储该像素的深度值.我试图通过执行以下操作将其可视化为灰度深度图像:
cv::Mat depthImage;
depthImage = cv::imread("coffee_mug_1_1_1_depthcrop.png", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ); // Read the file
depthImage.convertTo(depthImage, CV_32F); // convert the image data to float type
namedWindow("window");
float max = 0;
for(int i = 0; i < depthImage.rows; i++){
for(int j = 0; j < depthImage.cols; j++){
if(depthImage.at<float>(i,j) > max){
max = depthImage.at<float>(i,j);
}
}
}
cout << max << endl;
float divisor = max / 255.0;
cout << divisor << endl;
for(int i = 0; i < depthImage.rows; i++){
for(int j = 0; j < depthImage.cols; j++){
cout << depthImage.at<float>(i,j) << ", ";
max = depthImage.at<float>(i,j) /= divisor;
cout << depthImage.at<float>(i,j) << endl;
}
}
imshow("window", depthImage);
waitKey(0);
Run Code Online (Sandbox Code Playgroud)
然而,它只显示两种颜色,这是因为所有值都很接近,即在150-175 +范围内,显示黑色的小值(见下文).
有没有办法对这些数据进行标准化,以便显示各种灰度级以突出显示这些小的深度差异?
小智 21
根据文档,函数imshow可以与各种图像类型一起使用.它支持16位无符号图像,因此您可以使用显示图像
cv::Mat map = cv::imread("image", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
cv::imshow("window", map);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,图像值范围从范围[0,255*256]映射到范围[0,255].
如果您的图像仅包含此范围较低部分的值,您将观察到一个模糊的图像.如果你想使用整个显示范围(从黑色到白色),你应该调整图像以覆盖预期的动态范围,一种方法是
double min;
double max;
cv::minMaxIdx(map, &min, &max);
cv::Mat adjMap;
cv::convertScaleAbs(map, adjMap, 255 / max);
cv::imshow("Out", adjMap);
Run Code Online (Sandbox Code Playgroud)
Sam*_*Sam 20
添加到samg的答案,您可以扩展显示图像的范围.
double min;
double max;
cv::minMaxIdx(map, &min, &max);
cv::Mat adjMap;
// expand your range to 0..255. Similar to histEq();
map.convertTo(adjMap,CV_8UC1, 255 / (max-min), -min);
// this is great. It converts your grayscale image into a tone-mapped one,
// much more pleasing for the eye
// function is found in contrib module, so include contrib.hpp
// and link accordingly
cv::Mat falseColorsMap;
applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_AUTUMN);
cv::imshow("Out", falseColorsMap);
Run Code Online (Sandbox Code Playgroud)
结果应该类似于下面的结果