c++ countNonZero函数在openCV中给出Assert错误

gijlo24d  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(322)

我尝试使用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

有人能指出错误吗?

cpjpxq1n

cpjpxq1n1#

Assertsrc.channels() == 1意味着图像应该有1个通道,即它必须是灰色的,而不是彩色的。您在roi上调用countNonZeroroibinaryImage的子图像,binaryImagesrc的克隆,src最初是彩色的。
我猜你想写cvtColor(binaryImage, binaryImage, CV_BGR2GRAY);。在这种情况下,它是有意义的。但是,我没有看到你再次使用src,所以也许你不需要这个中间图像。如果你这样做,不要调用“binary”,因为“binary”在计算机视觉中通常代表黑色或白色图像,只有两种颜色。你的图像是“gray”,因为它有黑色和白色的所有阴影。
关于你原来的任务,三木是对的,你应该用cv::reduce,他已经给了你一个例子。

yhqotfr8

yhqotfr82#

顺便说一句,您可以使用reduce计算水平投影,作为参数CV_REDUCE_SUM
举个最小的例子:

Mat1b mat(4, 4, uchar(0));
mat(0,0) = uchar(1);
mat(0,1) = uchar(1);
mat(1,1) = uchar(1);

// mat is: 
//
// 1100
// 0100
// 0000
// 0000

// Horizontal projection, result would be a column matrix
Mat1i reducedHor;
cv::reduce(mat, reducedHor, 1, CV_REDUCE_SUM);

// reducedHor is:
//
// 2
// 1
// 0
// 0

// Vertical projection, result would be a row matrix
Mat1i reducedVer;
cv::reduce(mat, reducedVer, 0, CV_REDUCE_SUM);

// reducedVer is:
//
// 1200

// Summary
//
// 1100 > 2
// 0100 > 1
// 0000 > 0
// 0000 > 0
// 
// vvvv
// 1200

您可以像这样对图像使用此功能:

// RGB image
Mat3b img = imread("path_to_image");

// Gray image, contains values in [0,255]
Mat1b gray;
cvtColor(img, gray, CV_BGR2GRAY);

// Binary image, contains only 0,1 values
// The sum of pixel values will equal the count of non-zero pixels
Mat1b binary;
threshold(gray, binary, 1, 1, THRESH_BINARY);

// Horizontal projection
Mat1i reducedHor;
cv::reduce(binary, reducedHor, 1, CV_REDUCE_SUM);

// Vertical projection
Mat1i reducedVer;
cv::reduce(binary, reducedVer, 0, CV_REDUCE_SUM);
cfh9epnr

cfh9epnr3#

将图像转换为灰度,然后执行countNonZero(),它将工作

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
area = cv.countNonZero(gray)

相关问题