opencv — как получить доступ к координатам findNonZero, хранящимся в Mat Stack Overflow

Я новичок в OpenCV, и я прочитал некоторые учебные пособия и руководства, но я не совсем понял смысл некоторых вещей.

В настоящее время я пытаюсь обрезать двоичное изображение на два раздела. Я хочу знать, какая строка имеет наибольшее количество белых пикселей, а затем обрезать строку и все, что над ней, а затем перерисовать изображение, используя только данные под строкой с наибольшим количеством белых пикселей.

До сих пор я находил координаты белых пикселей, используя findNonZero, а затем сохранял их в Mat. Следующий шаг, где я запутался. Я не уверен, как получить доступ к элементам в Mat и выяснить, какая строка встречается чаще всего в массиве.

Я использовал тестовое изображение с моим кодом ниже. Это дало мне расположение пикселей [2,0; 1,1; 2,1; 3,1; 0,2; 1,2; 2,2; 3,2; 4,2; 1,3; 2,3; 3,3; 2,4]. Каждый элемент имеет координаты x и y белого пикселя. Прежде всего, как мне получить доступ к каждому элементу, а затем опросить только y-координату в каждом элементе, чтобы определить строку, которая встречается чаще всего? Я пытался использовать в<> () метод, но я не думаю, что я использовал его правильно.

Этот метод хороший способ сделать это или есть лучший и / или более быстрый способ? Я прочитал другой метод Вот используя L1-норму, но я не могу понять это, и будет ли этот метод быстрее, чем мой?

Любая помощь будет принята с благодарностью.

Ниже приведен код, который у меня есть.

#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

#include <iostream>

using namespace cv;
using namespace std;int main()
{
int Number_Of_Elements;
Mat Grayscale_Image, Binary_Image, NonZero_Locations;

Grayscale_Image = imread("Test Image 6 (640x480px).png", 0);
if(!Grayscale_Image.data)
{
cout <<  "Could not open or find the image" << endl;
return -1;
}

Binary_Image = Grayscale_Image > 128;

findNonZero(Binary_Image, NonZero_Locations);
cout << "Non-Zero Locations = " << NonZero_Locations << endl << endl;

Number_Of_Elements = NonZero_Locations.total();
cout << "Total Number Of Array Elements = " << Number_Of_Elements << endl << endl;

namedWindow("Test Image",CV_WINDOW_AUTOSIZE);
moveWindow("Test Image", 100, 100);
imshow ("Test Image", Binary_Image);

waitKey(0);
return(0);
}

4

Решение

Я ожидаю, что следующее будет работать:

Point loc_i = NonZero_Locations.at<Point>(i);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]