2012-09-20 147 views
2

我想用它的邊形成一個不規則形狀的手,這樣我就可以使用http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/moments/moments.html?highlight=moment#code找到這隻手的質心。 canny功能削減邊緣,因此我無法從中獲得良好的輪廓。 這裏有一個輸出樣本http://imageshack.us/photo/my-images/208/cannywithblur.png/ 和代碼。OpenCV獲取連接的邊緣

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

我想得到一個封閉的輪廓,只有一個輪廓。我怎樣才能做到這一點?

回答

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