2014-11-04 10 views
0

Android 기기에서 OpenCV를 사용하여 레이저 점을 추적하려고합니다. 이 레이저 점을 사용하여 내 카메라보기에 배치 된 캔버스에 그립니다.OpenCV Android 트랙 레이저 점

나는 카메라 해상도를 HSV 색 공간으로 변환하고 임계 값 필터링 (H 및 V 채널에서만)을 사용하여 내 레이저 점을 분리했습니다. 이것은 상당히 견고합니다.

public Mat onCameraFrame(CvCameraViewFrame cvf) { 
     // Grab the video frame 
     cvf.rgba().copyTo(originalFrame); 
     cvf.rgba().copyTo(frame); 

     // Convert it to HSV 
     Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGB2HSV); 

     // Split the frame into individual components (separate images for H, S, 
     // and V) 
     mChannels.clear(); 
     Core.split(frame, mChannels); // Split channels: 0-H, 1-S, 2-V 
     frameH = mChannels.get(0); 
     // frameS = mChannels.get(1); 
     frameV = mChannels.get(2); 

     // Apply a threshold to each component 
     Imgproc.threshold(frameH, frameH, 155, 160, Imgproc.THRESH_BINARY); 
     // Imgproc.threshold(frameS, frameS, 0, 100, Imgproc.THRESH_BINARY); 
     Imgproc.threshold(frameV, frameV, 250, 256, Imgproc.THRESH_BINARY); 

     // Perform an AND operation 
     Core.bitwise_and(frameH, frameV, frame); 

     // Display the result. 
     frameH.release(); 
     // frameS.release(); 
     frameV.release(); 
     frame.release(); 
     return originalFrame; 
    } 

이제 내 laserdot의 중심 좌표를 얻으려고합니다. 내 프레임에서 findContours 함수를 사용했지만 여러 점이 나타납니다.

다음에 사용할 필터에 대한 조언을 제공하여 올바른 방향으로 누군가를 안내해주기를 바랍니다.

아래는 처리 된 프레임을 보여주는 스크린 샷입니다. Processed frame

+0

위의 코드로 처리 된 예제 프레임이 도움이됩니다. 아마도 등고선이 표시된 것 같습니다. – beaker

+0

빨간 레이저 점의 추적을 보여주는 스크린 샷으로 내 질문을 편집했습니다. – Wouter

+0

나는 하나의 등고선 만 보았으므로 찾고있는 것이 맞을 것입니다. 맞습니까? C++에서 컨투어에 '순간'을 사용하면 질량 중심을 찾을 수 있습니다. http://docs.opencv.org/2.4.2/doc/tutorials/imgproc/shapedescriptors/moments/moments.html. – beaker

답변

0

마지막으로 위의 karlphilip에서 언급 한 경계 상자 기술을 사용했습니다.