3

深度マップの各ピクセルを操作しようとしています。(画像セグメンテーションを実装しています。) 深度が 1 より大きい画像のピクセルを処理する方法がわかりません。

このサンプル コードは、深度マップを別の cv::Mat にピクセル単位でコピーします。正規化するとうまくいきます(正規化された画像の深さ= 1)。しかし、深さ = 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));

関数を正規化する

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 の画像からピクセルを取得するにはどうすればよいですか?

4

2 に答える 2

3

画像の深度が 3 の場合、ピクセルごとにコピーするには次のようにします。

tmp.at<Vec3b>(i,j) = res.at<Vec3b>(i,j);

ただし、画像全体をコピーする場合は、ピクセルごとに異なる処理を行いたい場合を除いて、各ピクセルを個別にコピーするポイントがわかりません。

これにより、画像全体の res を tmp にコピーできます。

res.copyTo(tmp);
于 2013-04-13T14:30:30.963 に答える
3

Mat::depth()画像のビット深度を表す定数に等しい値を返します。たとえば、深度が に等しい場合、ピクセルを取得するには、 の代わりにCV_32F使用する必要があります。floatuchar

CV_8S->char

CV_8U->uchar

CV_16U->unsigned int

CV_16S->int

CV_32F->float

CV_64F->double

Mat::channels()そのタイプの値が座標にいくつ割り当てられているかを示します。これらの複数の値は として抽出できますcv::Vec。したがって、Matdepthの 2 つのチャネルがある場合はCV_8U、代わりに を使用するか、または1 つを使用Mat.at<uchar>する必要があります。Mat.at<Vec2b>Mat.at<Vec2f>CV_32F

于 2013-04-14T09:35:27.403 に答える