使用opencv / c ++检测不规则形状

时间:2018-11-10 16:47:21

标签: c++ opencv object-detection shapes kinect-v2

我想识别图1 highlighted shape(绿色边框)中显示的形状/标记

扫描的对象类似于桥。 不幸的是,我不知道如何检测特定形状。

图片2显示了原始RGB图片。 2.Original Image

我用边缘检测“ cv :: Canny”和轮廓“ cv :: findContours”(3.Edge detection results)对其进行编辑。

从现在开始,我不知道该怎么办。

我在c ++中使用opencv 3.4.2和libfreenect2。 我使用kinect v2进行录音。

代码部分调用图像(3.),并使用“ findContours”对其进行编辑。但是,仅显示外部矩形。但是我想显示整个表格,如图(1)所示。不幸的是,我不知道该怎么做。

我会很高兴获得帮助。随时发送一些代码示例。 谢谢

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


src.copyTo( dst, detected_edges);
imshow( window_name, dst );
imwrite ("Canny.png", dst);

image=imread ("Canny.png");
Mat converted (image.rows, image.cols, CV_8UC1);
Mat dat (image.rows, image.cols, CV_8UC1, Scalar ::all(0));
cvtColor(image, converted, COLOR_BGR2GRAY,1);
dilate(converted, converted, Mat(), Point(-1.5,-1.5));
threshold (converted, converted,25, 255, THRESH_BINARY);
    //findContours (converted, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE );
findContours (converted, contours,hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
    // Mat drawing =Mat::zeros (converted.size(), CV_8UC3);
    for (int i=0; i<contours.size(); i++)
    {
    double a= contourArea (contours[i], false);
    if(a>largest_area)
    	{
    	largest_area=a;
    	largest_contour_index=i;
    bounding_rect=boundingRect (contours[i]);
    	}	
    }
Scalar color (255,255,255);
drawContours (dat, contours, largest_contour_index, color, CV_FILLED,8,hierarchy);
rectangle (image, bounding_rect , Scalar (0,255,0),1,8,0);
imshow("dat", image);
imshow ("largestContour", dat);
imwrite("largestContour.png", image);
imwrite("dat.png", dat);

0 个答案:

没有答案