Я новичок в 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);
}
Я ожидаю, что следующее будет работать:
Point loc_i = NonZero_Locations.at<Point>(i);
Других решений пока нет …