我是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; 1,2,4].每个元素具有白色像素的x和y坐标.首先,我如何访问每个元素,然后只轮询每个元素中的y坐标以确定最多出现的行?我尝试使用at<>()方法,但我认为我没有正确使用它.
这种方法是一种很好的方法吗?还是有更好的和/或更快的方法?我已经阅读了使用L1-norm的另一种方法here但我无法理解它并且这种方法会比我的更快吗?
任何帮助将不胜感激.
下面是我到目前为止的代码.
#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);