【问题标题】:Copying two images pixel by pixel逐像素复制两个图像
【发布时间】:2013-04-13 12:28:13
【问题描述】:

我正在尝试处理深度图中的每个像素。 (我正在实现图像分割。)我不知道如何处理深度大于 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));

标准化函数

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 的图像中获取像素?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    Mat::depth() 返回的值等于表示图像位深度的常数。如果您获得的深度等于例如CV_32F,要获得像素,您需要使用float 而不是uchar

    CV_8S -> char

    CV_8U -> uchar

    CV_16U -> unsigned int

    CV_16S -> int

    CV_32F -> float

    CV_64F -> double

    Mat::channels() 告诉您有多少该类型的值分配给一个坐标。这些多个值可以提取为cv::Vec。因此,如果您有一个深度为CV_8U 的两个通道Mat,而不是使用Mat.at&lt;uchar&gt;,您将需要使用Mat.at&lt;Vec2b&gt;,或者Mat.at&lt;Vec2f&gt; 用于CV_32F 一个。

    【讨论】:

    • 谢谢,我切换到int,现在可以复制了!但后来我做 std::cout
    • Mat::channels()Mat::depth() 向您返回了什么?你也可以试试short int 而不是int。 OpenCV 中的类型定义不是很好。
    • std::cout
    • 好吧,我能想到的只有你尝试short int,检查你是否不应该更改tmp 的深度/类型,或者在你的代码中寻找错误。跨度>
    【解决方案2】:

    当您的图像深度为 3 时,执行此操作以逐像素复制:

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

    但是,如果您要复制整个图像,我不明白单独复制每个像素的意义,除非您想对不同的像素进行不同的处理。

    您可以通过以下方式将整个图像 res 复制到 tmp:

    res.copyTo(tmp);
    

    【讨论】:

    • 谢谢您的回答。我的任务不是复制,它只是问题的样本。我的任务是单独处理每个像素,以进行图像分割。我可以通过 Vect3b 将像素作为整数或相同的原始类型使用吗?
    • github.com/Daiver/scripts/blob/master/ocv/cpp/mystereo/main.cpp 第 74 行 - 我在这里使用像素,如果图像标准化,则工作正常,否则失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多