2015-07-05 13 views
6

Ich versuchte, horizontale Projektion mit countNonZero() -Funktion wie folgt zu bekommen.countNonZero Funktion gibt einen Assertion Fehler in openCV

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); 
} 

In der Zeile der callonZero() - Funktion ist jedoch ein Fehler aufgetreten. Der Fehler ist wie folgt.

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 

Kann jemand bitte den Fehler aufzeigen?

+4

binaryImage ist eine Kopie von src, die ein 3-Kanal-Farbbild darstellt. versuch cvtColor (src, binaryImage, CV_BGR2GRAY); – Micka

+2

gibt es einen weiteren Fehler: switch horizontal.at (0, i) zu horizontal.at (0, i) seit Sie 8-Bit-Datentyp erstellt haben. – Micka

+0

Ich habe die Änderungen und Fehler behoben. Dank dafür. Aber jetzt sehe ich, dass der von countNonZero (roi) zurückgegebene Wert immer Null ist. Ich habe auch bestätigt, dass binaryImage kein vollständig schwarzes Bild ist. (es hat überall schwarze und weiße Pixel) –

Antwort

11

Assertion src.channels() == 1 bedeutet, dass Bild 1 Kanal haben sollte, dh es grau sein muss, nicht farbig. Sie rufen countNonZero auf roi, die ein Unterbild von binaryImage ist, die ein Klon von src ist, die ursprünglich gefärbt ist.

Ich nehme an, Sie wollten cvtColor(binaryImage, binaryImage, CV_BGR2GRAY); schreiben. In diesem Fall macht es Sinn. Allerdings sehe ich nicht, dass Sie src irgendwo wieder verwenden, also brauchen Sie dieses Zwischenbild vielleicht nicht. Falls Sie dies tun, rufen Sie nicht "binär", da "binär" in Computer Vision in der Regel für Schwarz-Weiß-Bild, nur zwei Farben. Ihr Bild ist "grau", da es alle Schattierungen von Schwarz und Weiß hat.

In Bezug auf Ihre ursprüngliche Aufgabe, hat Miki Recht, sollten Sie dafür verwenden. Er hat dir bereits ein Beispiel gegeben, wie man es benutzt.

+0

Danke für die Antwort. Anders als die obigen Dinge musste ich mich ändern, Mat roi = binaryImage (Rect (0, 0, 1, binaryImage.rows)); wie dies, Mat roi = binaryImage (Rect (i, 0, 1, binärImage.rows)); Ich habe gerade die gleiche Spalte wiederholt. –

+0

@SamithaChaturanga Sie haben Recht, sicher. – Mikhail

0

BTW, können Sie die horizontale Projektion mit reduce berechnen geben als Argument CV_REDUCE_SUM.

Ein minimales Beispiel:

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 

Sie können dies wie folgt mit Ihren Bildern verwenden:

// 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); 
+0

Können Sie bitte Ihre Antwort ausarbeiten? Was ist reduzieren? Ist es eine Funktion?Wenn ja, wie benutze ich es für den Zweck? –

+0

Entschuldigung. Trotzdem ergibt das keinen Sinn. Zumindest hast du nicht einmal das Schwarz-Weiß-Bild benutzt, um seine horizontale Projektion zu erhalten. –

+0

@SamithaChathuranga Ich habe meine Antwort aktualisiert, hoffe, dass es Ihnen mehr Sinn macht. – Miki

Verwandte Themen