2

我想使用它的边缘形成手的不规则形状,以便我可以使用http://opencv.itseez.com/doc/tutorials/imgproc/shapeescriptors/moments/moments.html?highlight=找到这只手的质心时刻#代码。精明的功能切割边缘,所以我无法从中获得良好的轮廓。这是输出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);
}

我想得到一个封闭的轮廓,只有一个轮廓。我怎样才能做到这一点?

4

2 回答 2

1

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

文档中的对应函数

形态学操作教程

于 2012-09-20T09:45:36.610 回答
1

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

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

于 2012-09-21T02:16:02.133 回答