我正在做一个应该作为地平线探测的项目。我使用精明的边缘和轮廓进行地平线检测。它工作得很好,但是我对边缘的小区域有问题
所以问题是,如何摆脱小面积的边缘/轮廓?或者我如何只显示一个最大的轮廓?
以下图片显示了它的外观:
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).
您可以检查轮廓是否长于某个阈值,或者只过滤最长的轮廓。
我想提取图像的轮廓,用点坐标序列表示。 使用,我能够生成一个只包含图像边缘的二进制图像。然后,我尝试使用来提取轮廓。不过,结果并不好。 对于每一条边,我通常得到两条线,就像它被认为是一个非常薄的区域一样。我想简化我的轮廓,这样我可以把它们画成单线。或者用不同的函数提取它们,直接产生正确的结果会更好。 我查看了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%宽度,我不知道如何摆脱这个差距。