gpt4 book ai didi

C++ OpenCV如何消除小边缘或小区域的轮廓

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:50 24 4
gpt4 key购买 nike

我正在从事应该作为地平线检测工作的项目。我正在使用精明的边缘和轮廓进行地平线检测。它工作得很好,但我有小面积的边缘 > 轮廓的问题,这些边缘没有被高 cannythreshold 和 morfolocigal 操作消除。如果我在 canny 上使用更高的阈值,我会开始松开一些地平线边缘。

那么问题来了,如何去除小面积的边缘/轮廓?或者如何只显示一个最大的轮廓?

这张图片显示了它应该是什么样子:

http://i.stack.imgur.com/f4USX.png

这张照片是在我需要消除的轮廓上的小区域拍摄的:

http://i.stack.imgur.com/TQi0v.jpg

这是我的代码:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <sstream>
#include <string>
#include <iostream>
#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <opencv\ml.h>

using namespace cv;
using namespace std;

vector<Vec4i> lines;
vector<vector<Point> > contours0;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

int MAX_KERNEL_LENGTH = 31;


int main(int argc, char** argv)
{

string filename = "test.avi";
VideoCapture cap(filename);
if(!cap.isOpened())
return -1;

Mat edges,grey;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame;
cvtColor(frame, grey, CV_BGR2GRAY);


GaussianBlur(grey, grey, Size(5,5),0);


Mat erodeElement = getStructuringElement( MORPH_RECT,Size(10,10));
Mat dilateElement = getStructuringElement( MORPH_RECT,Size(10,10));


erode(grey,grey,erodeElement);
dilate(grey,grey,dilateElement);
Canny(grey, edges, 150,300, 3);


findContours( edges, contours0, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

contours.resize(contours0.size());
for( size_t k = 0; k < contours0.size(); k++ ){
approxPolyDP(Mat(contours0[k]), contours[k], 5, true);
}

int idx = 0;
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
drawContours( frame, contours, idx, Scalar(128,255,255), 5, 8, hierarchy );
}

imshow("frame", frame);
imshow("grey", grey);
imshow("edges", edges);
if(waitKey(30) >= 0) break;
}

return 0;
}

最佳答案

您可以使用 arcLength 函数 (http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#arclength) 根据轮廓的长度过滤轮廓。
您可以检查轮廓是否长于某个阈值,或者您只过滤最长的轮廓。

关于C++ OpenCV如何消除小边缘或小区域的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966215/

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