【问题标题】:OpenCV: assigning new values to matrix elementsOpenCV:为矩阵元素分配新值
【发布时间】:2014-03-21 00:02:10
【问题描述】:

我正在尝试读取图像并使用此代码将读取图像的一些值分配给另一个新图像:

cv::Mat source = cv::imread("001.jpg");
cv::cvtColor( source , source , CV_BGR2GRAY );
cv::Mat result = cv::Mat( source.rows, source.cols, source.type() );

int dx = 0; 
int dy = 0;
int len = 30;

for( int i = 0; i < source.cols - len; i ++ )
{
    dx = i + len;

    for( int j = 0; j < source.rows; j++ )
    {
        dy = j + 0.5 * dx;
        if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
        {
             result.at<uchar>(i,j) = source.at<uchar>(dx,dy);
        }
    }
}

但代码运行后停止,没有给出任何错误信息。我尝试调试它并怀疑result.at&lt;uchar&gt;(i,j) = source.at&lt;uchar&gt;(dx,dy) 行导致了问题。谁可以给我解释一下这个?

【问题讨论】:

    标签: c++ image opencv image-processing matrix


    【解决方案1】:

    尽管文档对此不是很清楚,但函数at 是这样使用的cv::Mat::at(y,x)。这可能是导致问题的原因。

    此外,为了使您的代码更高效,您应该像这样反转 x 和 y 循环:

    for( int j = 0; j < source.rows; j ++ )
    {
    
        for( int i = 0; i < source.cols- len; i++ )
        {
            dx = i + len;
            dy = j + 0.5*dx;
            if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
            {
                 result.at<uchar>(j, i) = source.at<uchar>(dy, dx);
            }
        }
    }
    

    这是因为在 OpenCV 中,图像是逐行存储的,因此将 x 循环定义为内部循环要快得多。

    【讨论】:

      【解决方案2】:

      除了下面的Berak 答案,我认为您还应该执行以下操作

      Initialize result image with zeros:感觉有问题。您的dx 在每个循环中都会增加30,因此您的for loop 只会在少数情况下运行。但是result 的单元格中的值应该是什么,这些值在for loop 期间无法填充

      【讨论】:

      • 是的,我尝试使用 imshow 显示它。那是它停止反应的时候。
      • 如果条件满足,那么你的一些像素得到了值,但是没有得到任何值的像素怎么样......所以初始化result图像,这样每个像素都有一些值(至少为零)。并且还颠倒了dx dy的顺序
      【解决方案3】:

      罪魁祸首在这里:

       result.at<uchar>(i,j) = source.at<uchar>(dx,dy);
      

      你得到了 i,j 以及 dx dy 倒数。

      在 opencv 中是 mat.at&lt;type&gt;(row,col);,而不是 mat.at&lt;type&gt;(x,y);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2017-11-27
        相关资源
        最近更新 更多