2011-12-22 5 views
0

intereseted에있는 blob의 윤곽선 내에서만 ROI를 지정하는 빠른 해결책이 있습니까?OpenCV C++/Obj-C : 특정 모양의 안쪽에있는 goodFeaturesToTrack

내 아이디어 지금까지 :

    boundingRect를 사용
  1. 하지만 내가 분석하고 싶지 않아 너무 많은 물건이 들어 있습니다. 전체 이미지에 goodFeaturesToTrack 적용
  2. 는 다음 출력을 통해 루프 내 모양의 윤곽 밖에 사전에

감사 한때를 제거하기 위해 좌표! 여기

가 일부 코드의 ... 이력서는 :: pointPolygonTest()가 옳은 것 같다,하지만 난 그것을 구현하는 방법을 잘 모르겠어요 :

편집

은 내가 필요한 것을 발견

// ... 
IplImage forground_ipl = result; 
IplImage *labelImg = cvCreateImage(forground.size(), IPL_DEPTH_LABEL, 1); 

CvBlobs blobs; 
bool found = cvb::cvLabel(&forground_ipl, labelImg, blobs); 
IplImage *imgOut = cvCreateImage(cvGetSize(&forground_ipl), IPL_DEPTH_8U, 3); 

if (found) { 
    vb::CvBlob *greaterBlob = blobs[cvb::cvGreaterBlob(blobs)]; 
    cvb::cvRenderBlob(labelImg, greaterBlob, &forground_ipl, imgOut); 
    CvContourPolygon *polygon = cvConvertChainCodesToPolygon(&greaterBlob->contour); 
} 

"polygon"에는 필요한 윤곽이 포함되어 있습니다. 오른쪽

- (std::vector<cv::Point2f>)pointsFromGoodFeaturesToTrack:(cv::Mat &)_image 
{ 
    std::vector<cv::Point2f> corners; 
    cv::goodFeaturesToTrack(_image,corners, 100, 0.01, 10); 
    return corners; 
} 

그래서 다음에 내가 코너를 통해 루프 필요하고 이력서와 각 지점을 확인 :: pointPolygonTest을() :

goodFeaturesToTrack이 방법을 구현?

당신은 당신의 관심의 영역 상에 마스크를 만들 수 있습니다
+0

원하는 것을 빠르게 보여줄 수 있습니까? – mevatron

+0

@ mevatron 귀하의 도움과 cvBlob을 사용하여 카톤 (다른 스레드)의 윤곽을 얻었습니다. 이제는 내가 좋아하는 상자의 모서리를 얻기 위해 입력 이미지에서 GoodFeaturesToTrack을 실행합니다. 다음 단계는 모서리 만 필터링하는 것입니다. 한 번은 판지 상자 안쪽에 있습니다. 당신이하고 싶은 것을 얻을 수 있기를 바랍니다 ... – dom

답변

3

:

편집 마스크를 만드는 방법 :

마스크 확인을;

Mat mask(origImg.size(), CV_8UC1); 
mask.setTo(Scalar::all(0)); 
// here I assume your contour is extracted with findContours, 
// and is stored in a vector<vector<Point>> 
// and that you know which contour is the blob 
// if it's not the case, use fillPoly instead of drawContour(); 
Scalar color(255,255,255); // white. actually, it's monchannel. 
drawContours(mask, contours, contourIdx, color); 

// fillPoly(Mat& img, const Point** pts, const int* npts, 
//   int ncontours, const Scalar& color) 

이제 사용할 준비가되었습니다. BUT, 결과를주의 깊게 살펴보십시오. OpenCV에서 피쳐 추출기에 대한 마스크 매개 변수와 관련된 몇 가지 버그에 대해 들었습니다.

// note the mask parameter: 

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, 
    double qualityLevel, double minDistance, 
    InputArray mask=noArray(), int blockSize=3, 
    bool useHarrisDetector=false, double k=0.04) 

이 또한 aplication의 속도를 향상시킬 수는 - goodFeaturesToTrack 시간의 호지의 양을 먹고, 당신은 단지 작은 이미지에 적용하면, 전체 이득은 중요하다.

+0

고마워요, 좋은 지적입니다! 하지만 CvContourPolygon을 OpenCV로 변환하는 방법을 모른다. InputArray ... – dom

+0

그냥 깨끗한 이미지에 플롯하라. 위의 편집을 확인한다. – Sam

관련 문제