【问题标题】:OpenCV Error: Assertion failed / when visit the pixel of matOpenCV 错误:断言失败/访问 mat 的像素时
【发布时间】:2017-04-04 20:58:59
【问题描述】:

我正在使用 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 ::channels) > ((DataType<_tp>::depth) & ((1

我用谷歌搜索了这条错误消息,看起来我访问了矩阵之外的像素。

但我确实有 i &lt; dst.colsj &lt; dst.rows 来确保不会发生这种情况,对吧?

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

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:
    dst = imread("dst.png", CV_LOAD_IMAGE_GRAYSCALE);
    

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

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

    您可以阅读更多详情here.

    【讨论】:

      【解决方案2】:

      如您所见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) 索引。

      【讨论】:

        【解决方案3】:

        你做错了两件事:

        1. 你的图像是灰度的(uchar),所以你需要用.at&lt;uchar&gt;(...)访问它
        2. 您以(col, row) 访问图像,而OpenCV(和任何与矩阵相关的)约定是(row, col)。您还可以在迭代中使用助记符:rc 分别表示 rowcol

          for(int r=0; r<dst.rows; r++) {
              for( c=0; c<dst.cols; c++){
                  dstSum += dst.at<uchar>(r, c);
              }   
          }
          

        您还可以稍微改进您的代码:

        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
          

        【讨论】:

          猜你喜欢
          • 2014-11-25
          • 2016-02-21
          • 1970-01-01
          • 2017-12-24
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-14
          相关资源
          最近更新 更多