当前位置: 首页 > 知识库问答 >
问题:

C OpenCV如何消除小边缘或小面积轮廓

姬和豫
2023-03-14

我正在做一个应该作为地平线探测的项目。我使用精明的边缘和轮廓进行地平线检测。它工作得很好,但是我对边缘的小区域有问题

所以问题是,如何摆脱小面积的边缘/轮廓?或者我如何只显示一个最大的轮廓?

以下图片显示了它的外观:

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;
}

共有1个答案

邓毅
2023-03-14

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

 类似资料:
  • 我想提取图像的轮廓,用点坐标序列表示。 使用,我能够生成一个只包含图像边缘的二进制图像。然后,我尝试使用来提取轮廓。不过,结果并不好。 对于每一条边,我通常得到两条线,就像它被认为是一个非常薄的区域一样。我想简化我的轮廓,这样我可以把它们画成单线。或者用不同的函数提取它们,直接产生正确的结果会更好。 我查看了OpenCV的文档,但没有找到任何有用的东西,但我想我不是第一个遇到类似问题的人。有什么功

  • 我正在为Cytoscape版本3.8.2中的网络创建一个手动布局。我希望能够定义边缘长度,这样网络看起来更均匀。有定义属性边长的方法吗? 具体地说,我希望像下面的网络小节是一个完美的圆。

  • 在Azure上,我得到了一个IoT边缘设备,其中安装了一些模块(容器)(它是一台Linux机器)。找不到任何地方可以告诉我这些模块的磁盘大小。问题是一些模块是由一些专有软件远程部署的,我无法事先知道这些软件的大小。问题是-我如何知道每个模块的大小?

  • 我正试图用Java编写一个OpenCV程序,用手机拍摄一个标记的照片,并在标记上找到圆形轮廓。我已经让它在Android模拟器中工作(照片有完美的照明条件),但无法让它在手机上工作。这是我试图捕捉的标记: 在使用转换为灰度、高斯模糊和Canny边缘检测器的组合后,我得到以下输出: 如果我尝试在图像上查找轮廓,返回的轮廓数非常高(超过1000个),但它们没有闭合(因为边缘似乎太弱。在原始图像上绘制的

  • 在一次采访中被问到。我们在二维平面上得到N个点x[0],y[0]...... x[n-1],y[n-1]和一个整数K。 我们需要找到最小面积平方,整数坐标为顶点,边平行于坐标轴。包围至少K个给定的N个点,没有点躺在正方形的边界上,即所有K个点都应该严格在正方形内。 我想到了经典的最小封闭矩形问题,但无法推导出至少K个点的情况。如何处理这个问题?提前谢谢。

  • 我做了一个小提琴样本来演示所讨论的行为。 如果您注意到,在表的右侧,行边框和面板边框之间有轻微的间隙。这种差距在某些分辨率/缩放/大小组合时消失,但在其他组合时可见。问题是面板的宽度通常是123.45px,而表格只有123px。因为他们都设置为100%宽度,我不知道如何摆脱这个差距。