我尝试使用countNonZero()函数获取水平投影,如下所示。
Mat src = imread(INPUT_FILE, CV_LOAD_IMAGE_COLOR);
Mat binaryImage = src.clone();
cvtColor(src, src, CV_BGR2GRAY);
Mat horizontal = Mat::zeros(1,binaryImage.cols, CV_8UC1);
for (int i = 0; i<binaryImage.cols; i++)
{
Mat roi = binaryImage(Rect(0, 0, 1, binaryImage.rows));
horizontal.at<int>(0,i) = countNonZero(roi);
cout << "Col no:" << i << " >>" << horizontal.at<int>(0, i);
}
但是在调用countonZero()函数的那一行出现了一个错误,错误如下。
OpenCV Error: Assertion failed (src.channels() == 1 && func != 0) in cv::countNo
nZero, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\st
at.cpp, line 549
有人能指出错误吗?
3条答案
按热度按时间cpjpxq1n1#
Assert
src.channels() == 1
意味着图像应该有1个通道,即它必须是灰色的,而不是彩色的。您在roi
上调用countNonZero
,roi
是binaryImage
的子图像,binaryImage
是src
的克隆,src
最初是彩色的。我猜你想写
cvtColor(binaryImage, binaryImage, CV_BGR2GRAY);
。在这种情况下,它是有意义的。但是,我没有看到你再次使用src
,所以也许你不需要这个中间图像。如果你这样做,不要调用“binary”,因为“binary”在计算机视觉中通常代表黑色或白色图像,只有两种颜色。你的图像是“gray”,因为它有黑色和白色的所有阴影。关于你原来的任务,三木是对的,你应该用
cv::reduce
,他已经给了你一个例子。yhqotfr82#
顺便说一句,您可以使用
reduce
计算水平投影,作为参数CV_REDUCE_SUM
。举个最小的例子:
您可以像这样对图像使用此功能:
cfh9epnr3#
将图像转换为灰度,然后执行countNonZero(),它将工作