2011-10-10 5 views
4

OpenCV 물체 감지에 대한 정보를 읽거나 연구를 한 후에도 비디오 프레임에서 막대를 어떻게 감지 할 수 있을지 잘 모릅니다. 사용자가 주위를 움직여도 감지 할 수있는 가장 좋은 방법은 무엇입니까? 나는 막대기를 칼로 사용하고 그것에서 광선 검을 만든다. 내가 시작할 수있는 곳이라면 요? 감사!OpenCV 특정 물체 감지

답변

7

이것은 일반적으로 Hough 라인 변환이 될 것입니다. Hough 변환은 장면에서 직선 (또는 다른 등고선)을 찾도록 설계되었으며 OpenCV는 이러한 선을 매개 변수화하여 끝점 좌표를 얻을 수 있습니다. 그러나, 현명한 말은, 라이트 세이버 효과를하는 경우 멀리 갈 필요가 없습니다. 스틱 오렌지를 페인트하고 크로마 키를하십시오. Adobe Premiere, Final Cut Pro, Sony Vegas 등의 표준 기능. OpenCV 버전은 프레임을 HSV 색상 모드로 변환하고 원하는 색상 및 채도 영역에있는 그림의 영역을 분리합니다.

http://opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html?highlight=hough

는 여기에 내가 예를 들어 쓴 오래된 루틴 :

//Photoshop-style color range selection with hue and saturation parameters. 
//Expects input image to be in Hue-Lightness-Saturation colorspace. 
//Returns a binary mask image. Hue and saturation bounds expect values from 0 to 255. 
IplImage* selectColorRange(IplImage *image, double lowerHueBound, double upperHueBound, 
       double lowerSaturationBound, double upperSaturationBound) { 
    cvSetImageCOI(image, 1); //select hue channel 
    IplImage* hue1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1); 
    cvCopy(image, hue1); //copy hue channel to hue1 
    cvFlip(hue1, hue1); //vertical-flip 
    IplImage* hue2 = cvCloneImage(hue1); //clone hue image 
    cvThreshold(hue1, hue1, lowerHueBound, 255, CV_THRESH_BINARY); //threshold lower bound 
    cvThreshold(hue2, hue2, upperHueBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound 
    cvAnd(hue1, hue2, hue1); //intersect the threshold pair, save into hue1 
    cvSetImageCOI(image, 3); //select saturation channel 
    IplImage* saturation1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1); 
    cvCopy(image, saturation1); //copy saturation channel to saturation1 
    cvFlip(saturation1, saturation1); //vertical-flip 
    IplImage* saturation2 = cvCloneImage(saturation1); //clone saturation image 
    cvThreshold(saturation1, saturation1, lowerSaturationBound, 255, CV_THRESH_BINARY); //threshold lower bound 
    cvThreshold(saturation2, saturation2, upperSaturationBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound 
    cvAnd(saturation1, saturation2, saturation1); //intersect the threshold pair, save into saturation1 
    cvAnd(saturation1, hue1, hue1); //intersect the matched hue and matched saturation regions 
    cvReleaseImage(&saturation1); 
    cvReleaseImage(&saturation2); 
    cvReleaseImage(&hue2); 
    return hue1; 
} 

약간 장황하지만 당신은 아이디어를 얻을!

+0

내 스틱의 길이를 얻기 위해 blob 트래커를 사용해야합니까? 또는 나의 막대기의 출발점 그리고 종점을 얻는 다른 방법 있는가? 감사! – Caloyskie

+0

바이너리 이미지의 'findContours'를 찾을 수 있습니다. 'contourArea'를 사용하여 가장 큰'contour'를 찾은 다음'minAreaRect'를 사용하여'contour' 주변의 경계 모양 인'RotatedRect'를 얻으십시오. 'RotatedRect'의 높이가 여러분의 스틱 길이가 될 것입니다. –

+0

findContours를 사용했는데, 생성 된 사각형이 객체가 움직일 때 특히 안정적이지 않다고 생각합니다. 그런 다음 Hough Transform CV_HOUGH_PROBABILISTIC을 사용하여 작업을 수행했습니다. 고마워. – Caloyskie

2

OpenCV 용으로 작성된 얼굴 인식 (교육 & 감지) 기술을 따라 시작할 수 있습니다.

특정 단계를 찾고 있다면 알려주십시오.

+1

음 ... 막대기를 추적하는 데 어느 정도 적용되는지 확실하지 않습니다. –

+0

안녕 매트, 생각해 : 막대기, 일반적으로 원통형 물체로 상상. 3D 공간의 어느 위치 에나있을 수있는 실린더. 펜처럼 유사한 원통형 물체를 탐지하고 추적 할 수있는 경우가 있습니다! 다시 말하지만, 이러한 객체의 특징은 항상 탐지/추적을 개선하는 데 도움이됩니다. 따라서이 '스틱'의 고유 한 기능을 분류해야 할 수도 있습니다. 이러한 객체의 샘플 이미지 (부정 및 양수 모두)는 내 의견을 개선하는 데 확실히 도움이 될 것입니다. –

+0

누군가, 스틱을 감지하기 위해 Hough 변환 코드를 추가했다고 생각합니다! 그러나 어떤 대상의 방향을 고려해야했습니다. 폐색은 다른 측면입니다. Lowe의 논문은 이런 점에서 도움이 될 수 있습니다. –

2

내 옛날 교수는 항상 컴퓨터 비전의 첫 번째 법칙은 이미지를 할 수있는 일을하는 것이 당신의 일을 더 쉽게하기위한 것이라고 말했습니다.

스틱의 모양을 제어 할 수 있다면 가장 특별한 행운의 그림을 그릴 수 있습니다. 네온 핑크 또는 배경에 표시되지 않을 가능성이있는 것입니다. 연결된 컴포넌트 레이블과 결합 된 색상 세분화. 그것은 매우 빠를 것입니다.