渲染彩色图(渲染深度图)
彩色图
根据像素的某一属性将像素值由黑白变换到彩色空间,以深度图举例
直方图拉伸
为体现深度差异,对深度图进行直方图拉伸
彩色空间变换
根据直方图0~255的拉伸,变换到彩色图像
实例
double min;
double max;
int maxIDX;
int minIDX;
//cv::minMaxIdx(depthMapACV, &min, &max,&minIDX,&maxIDX, mask);
cv::minMaxIdx(depthMapACV, &min, &max,&minIDX,&maxIDX);
cv::Mat adjMap;
// Histogram Equalization
float scale = 255 / (max - min);
depthMapACV.convertTo(adjMap, CV_8UC1, scale, -min*scale);
// 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_JET);
cv::imshow("Out", falseColorsMap);
cv::waitKey(0);
结果
参考:https://stackoverflow.com/questions/13840013/opencv-how-to-visualize-a-depth-image
更一般的形式
除了图像之外,我们可能想渲染其它的结构,例如Mesh网格,这时我们依然可以借助opencv的applyColorMap
接口来实现。
这里用vcg Mesh结构举例实现渲染网格梯度场
std::vector<float> norms(vertices.size());
std::vector<uchar> normsC(vertices.size());
int i(0);
foreach(v, vertices) {
norms[i++] = norm(grad[v]);
}
cv::normalize(norms, norms, 1.0, 0.0, cv::NORM_MINMAX);
i = 0;
for (auto& n : norms)
{
normsC[i++] = n * 255;
}
cv::equalizeHist(normsC, normsC);
cv::Mat falseColorsMap;
cv::applyColorMap(normsC, falseColorsMap, cv::COLORMAP_JET);
i = 0;
for (auto& v : m.vert)
{
//float val = normsC[i++];
uchar valB = falseColorsMap.at<cv::Vec3b>(i).val[0];
uchar valG = falseColorsMap.at<cv::Vec3b>(i).val[1];
uchar valR = falseColorsMap.at<cv::Vec3b>(i).val[2];
v.C() = vcg::Color4b(valR, valG, valB, 1);
i++;
}
vcg::tri::io::ExporterOFF<MyMesh>::Save(m, path.c_str(), vcg::tri::io::Mask::IOM_VERTCOLOR);