OpenCV错误:断言失败/访问mat

时间:2016-11-21 12:48:57

标签: c++ opencv

我正在使用OpenCV尝试从灰度图片中计算每个像素的总和。

cv::Mat dst;
dst = imread("dst.png", CV_LOAD_IMAGE_GRAYSCALE);
for (i = 0; i < dst.cols; i++)
{
    for (j = 0; j < dst.rows; j++)
    {
        dstSum += dst.at<Vec3b>(i, j)[0];
    }
}

然后出现错误:

  

OpenCV错误:断言失败(dims&lt; = 2&amp;&amp; data&amp;&amp;(unsigned)i0&lt;(unsigned)size.p [0]&amp;&amp;(unsigned)(i1 * DataType&lt; _Tp&gt; :: channels)&lt;(unsigned)(size.p [1] * channels())&amp;&amp;((((sizeof(size_t)&lt;&lt; 28)| 0x8442211)&gt;&gt;(( cv :: Mat :: at,

中的DataType&lt; _Tp&gt; :: depth)&amp;((1&lt;&lt;&lt; 3) - 1))* 4)&amp; 15)== elemSize1())

我用Google搜索了这条错误信息,看起来我从矩阵中访问了像素。

但我确实有i < dst.colsj < dst.rows以确保不会发生情况,对吗?

那么这个错误的可能原因是什么...... 有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:1)

dst = imread("dst.png", CV_LOAD_IMAGE_GRAYSCALE);

您将dst读取为灰度8位图像,这意味着每个像素具有1个通道,并且该通道具有8位深度。所以循环内部应该是

dstSum += dst.at<uchar>(i, j);

您可以阅读更多详情here.

答案 1 :(得分:0)

正如您所看到的here,OpenCV使用(row,col)索引。

尝试

for(i=0;i<dst.rows;i++){
    for(j=0;j<dst.cols;j++){
        dstSum += dst.at<uchar>(i, j);
    }
}

而不是你的(col,row)索引。

答案 2 :(得分:0)

你做错了两件事:

  1. 您的图片为灰度(uchar),因此您需要使用.at<uchar>(...)
  2. 进行访问
  3. 您正在以(col, row)的形式访问图像,而OpenCV(以及任何与矩阵相关的)约定为(row, col)。您还可以在迭代中使用助记符:rc分别用于 col

    for(int r=0; r<dst.rows; r++) {
        for( c=0; c<dst.cols; c++){
            dstSum += dst.at<uchar>(r, c);
        }   
    }
    
  4. 您还可以稍微改进一下代码:

    1. 您可以使用Mat1b并像at(i,j)

      一样访问它
      Mat1b dst = imread(...);
      for(int r=0; r<dst.rows; r++) {
          for( c=0; c<dst.cols; c++){
              dstSum += dst(r, c);
          }   
      }
      
    2. 新的OpenCV名称为IMREAD_GRAYSCALE

      Mat1b dst = imread("path_to_image", IMREAD_GRAYSCALE);
      
    3. 您可以使用cv::sum来总结所有像素。由此产生的改进代码将是:

      Mat1b dst = imread("path_to_image", IMREAD_GRAYSCALE);
      int dstSum = sum(dst)[0]; // take only first channel