검색결과 리스트
글
Extract contour area using OpenCV in Android(OpcnCV에서 검출된 영역의 넓이 구하기)
※이 프로그램은 OpenCV의 예제파일인 OpenCV Sample - color-blob-detection을 수정한 자료임을 알립니다.
OpenCV의 색상 검출 프로그램을 돌려보면 원하는 영역이 아래와 같이 붉은 테두리로 나타나는 것을 보실 수 있을 것입니다.
위 그림에서 보시는 이 빨간 테두리를 '등고선(Contour)'라 부릅니다. Android OpenCV에서는 이 빨간 테두리가 쳐진 부분의 넓이를 추출하는 기능을 가지고 있습니다. 이를 적용하는 방법은 아래외 같이 하시면 되겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class ColorBlobDetectionActivity extends Activity implements OnTouchListener, CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private boolean mIsColorSelected = false; private Mat mRgba; private Scalar mBlobColorRgba; private Scalar mBlobColorHsv; private ColorBlobDetector mDetector; private Mat mSpectrum; private Size SPECTRUM_SIZE; private Scalar CONTOUR_COLOR; private CameraBridgeViewBase mOpenCvCameraView; List<MatOfPoint> contours; } |
위의 코드에서 contour 변수는 원래 onCameraFrame() 함수 내에 있는 변수입니다. 이를 다른 곳에서 사용하기 위해서는 위의 코드에서 보시는 것 처럼 전역변수로 선언하는 것이 사용하기에 편합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); if (mIsColorSelected) { mDetector.process(mRgba); contours = mDetector.getContours(); Log.e(TAG, "Contours count: " + contours.size()); Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR); Mat colorLabel = mRgba.submat(4, 68, 4, 68); colorLabel.setTo(mBlobColorRgba); Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols()); mSpectrum.copyTo(spectrumLabel); } return mRgba; } |
onCameraFrame() 함수 내에 있던 contours 변수를 외부에 전역으로 선언하였으므로 이 함수 안에서는 그냥 변수에 값을 넣는 개념으로 이해하시면 되겠습니다.
1 2 3 4 5 6 7 8 | if(contours != null){ double d; d=0; for(int i=0; i<contours.size();i++){ d += Imgproc.contourArea(contours.get(i)); } } |
프로그램을 처음 구동할 때 contours의 값이 null일 경우가 있으므로 if문을 통해 null일 경우 예외처리를 해줍니다.
그 다음으로 contours 내의 모든 등고선의 값을 d에 저장을 하시면 화면에 표시되는 등고선(Contour)의 면적값들을 구하실 수 있습니다.
위에서 보시는 바와 같이 contours는 List 변수로 내부에는 화면에 표시된 등고선의 수 만큼의 Mat 값들이 있는 것을 확인하실 수 있습니다. 이러한 contours를 반복문을 통해서 각 하나의 contour값을 확인하는 과정을 거칩니다.
Imageproc.contourArea() 함수는 해당 Contour의 값을 구하는 기능을 가지고 있습니다. 이를 통하여 해당 contour의 넓이를 구해 모든 값을 더하게 되면 화면에 표시된 붉은 영역의 총 면적을 구할 수 있게 됩니다.
'안드로이드 > 애플리케이션 제작' 카테고리의 다른 글
xml graphical layout가 정상적으로 동작하지 않을 때 (0) | 2015.02.05 |
---|---|
XML의 Graphical Layout이 보이지 않는 경우 해결법 (0) | 2015.02.03 |
Color detection using Android openCV(안드로이드 OpenCV로 특정 색깔 인식) (3) | 2014.12.06 |
Use front camera with OpenCV 2.4.9 for android(안드로이드 OpenCV에서 전면카메라 적용 방법) (2) | 2014.12.01 |
블루투스를 통해 이미지를 바이트로 전송하기 (38) | 2014.11.20 |