我正在尝试使用深度贴图中的每个像素。 (我正在实施图像分割。)我不知道如何使用深度大于1的图像中的像素。
此示例代码将深度贴图逐个像素地复制到另一个cv :: Mat。如果我将其标准化(标准化图像的深度= 1),它工作正常。但它不适用于depth = 3,因为.at<uchar>
对于这个深度是错误的操作。
cv::Mat res;
cv::StereoBM bm(CV_STEREO_BM_NORMALIZED_RESPONSE);
bm(left, right, res);
std::cout<<"type "<<res.type()<<" depth "<<res.depth()<<" channels "<<res.channels()<<"\n";// type 3 depth 3 channels 1
cv::Mat tmp = cv::Mat::zeros(res.rows, res.cols, res.type());
for(int i = 0; i < res.rows; i++)
{
for(int j = 0; j < res.cols; j++)
{
tmp.at<uchar>(i, j) = res.at<uchar>(i, j);
//std::cout << (int)res.at<uchar>(i, j) << " ";
}
//std::cout << std::endl;
}
cv::imshow("tmp", normalize(tmp));
cv::imshow("res", normalize(res));
normilize function
cv::Mat normalize(cv::Mat const &depth_map)
{
double min;
double max;
cv::minMaxIdx(depth_map, &min, &max);
cv::Mat adjMap;
cv::convertScaleAbs(depth_map, adjMap, 255 / max);
return adjMap;
}
左图像 - tmp,右图像 - res
如何从深度等于3的图像中获取像素?
答案 0 :(得分:3)
当您的图像深度为3时,请执行此操作以逐个像素复制:
tmp.at<Vec3b>(i,j) = res.at<Vec3b>(i,j);
但是,如果您要复制整个图像,我不明白单独复制每个像素的重点,除非您想对不同的像素进行不同的处理。
您可以通过以下方式将整个图像res复制到tmp:
res.copyTo(tmp);
答案 1 :(得分:3)
Mat::depth()
返回的值等于图像的位符号的常量符号化。如果您获得的深度等于CV_32F
,则要获得像素,您需要使用float
代替uchar
。
CV_8S
- &gt; char
CV_8U
- &gt; uchar
CV_16U
- &gt; unsigned int
CV_16S
- &gt; int
CV_32F
- &gt; float
CV_64F
- &gt; double
Mat::channels()
告诉您为该坐标分配了多少个该类型的值。这些多个值可以提取为cv::Vec
。因此,如果您有两个频道Mat
深度为CV_8U
,而是使用Mat.at<uchar>
您需要使用Mat.at<Vec2b>
或Mat.at<Vec2f>
来CV_32F
一个。