gpt4 book ai didi

c++ - 如何访问存储在 Mat C++ 中的 findNonZero 坐标

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:26 32 4
gpt4 key购买 nike

我是 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 坐标以确定出现次数最多的行?我尝试过使用 at<>() 方法,但我认为我没有正确使用它。

这种方法是一种很好的方法还是有更好和/或更快的方法?我读过另一种方法 here使用 L1-norm 但我无法理解它,这种方法会比我的更快吗?

如有任何帮助,我们将不胜感激。

下面是我到目前为止的代码。

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

关于c++ - 如何访问存储在 Mat C++ 中的 findNonZero 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15866586/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com