OpenCV:为矩阵元素分配新值

OpenCV: assigning new values to matrix elements

本文关键字:元素 分配 新值 OpenCV      更新时间:2023-10-16

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

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<uchar>(i,j) = source.at<uchar>(dx,dy)行导致了问题。有人可以向我解释一下吗?

罪魁祸首在这里:

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

你得到了相反的 I,J 和 DX Dy。

它在OpenCV中mat.at<type>(row,col);,而不是mat.at<type>(x,y);

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

Initialize result image with zeros: 我觉得有问题。您的dx在每个循环中都会递增 30,因此,您的for loop将仅在少数情况下运行。但是在for loop期间无法填充的result单元格中的值应该是多少

尽管

文档对此不是很清楚,但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 循环定义为内部循环要快得多。