【问题标题】:OpenCV getting edges that are connectedOpenCV获取连接的边缘
【发布时间】:2012-09-12 13:10:58
【问题描述】:

我想用它的边缘形成手的不规则形状,这样我就可以使用http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/moments/moments.html?highlight=moment#code 找到这只手的质心。精明的功能切割边缘,所以我无法从中获得良好的轮廓。 这是输出的示例http://imageshack.us/photo/my-images/208/cannywithblur.png/ 和代码。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;

int main(){

    cv::Mat image= cv::imread("open_1a.jpg");
    cv::Mat contours_mat;
    cv::Mat gray_image;

    blur( image, image, Size(3,3) );

    cv::Canny(image,
        contours_mat,
        40,
        120);
    cv::namedWindow("Image");
    cv::imshow("Image",image);
    cv::namedWindow("Canny");
    cv::imshow("Canny",contours_mat);
    cv::waitKey(0);
}

我想得到一个封闭的轮廓,只有一个轮廓。我该怎么做?

【问题讨论】:

    标签: c++ image-processing opencv contour centroid


    【解决方案1】:

    您可以尝试应用二值图像的形态闭合,它应该连接具有小于结构元素大小的间隙的边缘。

    Corresponding function in the documentation

    Tutorial on morphological operations

    【讨论】:

      【解决方案2】:

      您可以尝试均值移位聚类,它可以为手部生成一个漂亮的大连接区域。尝试仅根据边缘识别形状可能会很棘手,尤其是当形状不是简单的多边形时。

      http://my.safaribooksonline.com/book/programming/opencv/9780596516130/tracking-and-motion/mean-shift_and_camshift_tracking

      如果均值偏移(或类似算法)可以在手和其他物体之间产生良好的分割,那么找到几何中心或质心就很简单了。

      你能改变你的灯光吗?这可能会有所帮助。手指末端和中指上的指甲存在一个问题,因为对比度低:背景颜色和中指的颜色差别不大。

      正面的准直照明可以消除阴影。另一种选择是使用背光。

      如果由于某种原因您必须使用边缘,那么连接断边的最有前途的技术之一(“形状补全”)依赖于“自然”或“美学”曲线,例如欧拉螺旋。给定两个端点和这些端点的切线,可以找到一条自然的连接曲线。

      http://www.lems.brown.edu/vision/researchAreas/EulerSpiral/index.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 2017-07-06
        相关资源
        最近更新 更多