我正在使用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.cols
和j < dst.rows
以确保不会发生情况,对吗?
那么这个错误的可能原因是什么...... 有人可以帮我这个吗?
答案 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)
你做错了两件事:
uchar
),因此您需要使用.at<uchar>(...)
您正在以(col, row)
的形式访问图像,而OpenCV(以及任何与矩阵相关的)约定为(row, col)
。您还可以在迭代中使用助记符:r
和c
分别用于行和 col 。
for(int r=0; r<dst.rows; r++) {
for( c=0; c<dst.cols; c++){
dstSum += dst.at<uchar>(r, c);
}
}
您还可以稍微改进一下代码:
您可以使用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);
}
}
新的OpenCV名称为IMREAD_GRAYSCALE
:
Mat1b dst = imread("path_to_image", IMREAD_GRAYSCALE);
您可以使用cv::sum
来总结所有像素。由此产生的改进代码将是:
Mat1b dst = imread("path_to_image", IMREAD_GRAYSCALE);
int dstSum = sum(dst)[0]; // take only first channel