2013-02-13 1 views
2

OpenCv4Android Library를 사용하고 있으며 샘플 프로그램 color-blob-detection을 사용하고 있습니다. 이것으로 , 윤곽을 그리려면, 그들은 먼저 식을 필터링 : 그들은 필터링 된 각 스칼라 곱을 사용 된 후에 큰 형상의 윤곽 (면적> 0.1 * (면적) 다음contour plot OpenCV4Android 라이브러리

if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) { 
      Core.multiply(contour, new Scalar(4,4), contour); 
      mContours.add(contour); 

등고선의 목적은 무엇입니까? 여러 개의 작은 윤곽선을 병합하는 것입니까? 아이디어를 얻지 못했습니다. 두 번째 이유는 왜 곱셈 계수 Scalar (4,4)를 사용했는지, 다른 이유는 무엇입니까?

코드 :

Imgproc.pyrDown(rgbaImage, mPyrDownMat); 
    Imgproc.pyrDown(mPyrDownMat, mPyrDownMat); 

    Imgproc.cvtColor(mPyrDownMat, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL); 

    Core.inRange(mHsvMat, mLowerBound, mUpperBound, mMask); 
    Imgproc.dilate(mMask, mDilatedMask, new Mat()); 

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 

    Imgproc.findContours(mDilatedMask, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

    // Find max contour area 
    double maxArea = 0; 
    Iterator<MatOfPoint> each = contours.iterator(); 
    while (each.hasNext()) { 
     MatOfPoint wrapper = each.next(); 
     double area = Imgproc.contourArea(wrapper); 
     if (area > maxArea) 
      maxArea = area; 
    } 

    // Filter contours by area and resize to fit the original image size 
    mContours.clear(); 
    each = contours.iterator(); 
    while (each.hasNext()) { 
     MatOfPoint contour = each.next(); 
     if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) { 
      Core.multiply(contour, new Scalar(4,4), contour); 
      mContours.add(contour); 

    Imgproc.drawContours(mRgba, mContours, -1, CONTOUR_COLOR); 

답변

1

당신이 코드를 보면, 당신은 그들이 먼저 사용합니까 것을 볼 수 있습니다 : 프레임 길이와 높이가 넷으로 나눈 다음 줄에

Imgproc.pyrDown(rgbaImage, pyrDownMat); //Divide length and height by 2 
Imgproc.pyrDown(pyrDownMat, pyrDownMat); //Divide length and height by 2 

을이 필요한 공정 시간을 줄일 수 . 원래 프레임에 등고선을 되돌리려면 길이와 높이의 크기를 4로 조정해야합니다. 이유는이 줄이 사용됩니다.

new Scalar(4,4) 

나는 내가 그것을 분명히 희망, Whatt u는 말했다

0

당분간 나는이 질문에 완전히 대답 할 수 없지만 여기에는 내가 얻는 것이있다.

Core.multiply(contour, new Scalar(4,4), contour); 

첫 번째 매개 변수는 원본 행렬이고 두 번째 매개 변수는 곱하기 요소이며 세 번째 매개 변수는 결과 행렬입니다. 이를 염두에두면이 코드는 소스 컨투어를 4 배로 스케일합니다.

왜 4입니까? 이것은 모르겠지만 코드 위의 설명 - "원본 이미지 크기에 맞게 크기 조정" - 아이디어는 그 피팅을 수행하는 것이었지만 컨투어에 4.

+0

이 문서에서 이미 분명하다 ...하지만 필요한 덩어리를 얻을 수), 1) 왜 스칼라 떨어 졌 곱해야합니까? 2) 내가 스칼라 (3,3)로 바꿀 때 윤곽선이 작아지고 (분명히), 어긋나게된다. 왜 그런지 이해할 수 없다 !! – sumit

+0

질문에 "몇 가지 작은 등고선을 병합합니까?"라고 묻습니다. 나는 그것이 사실이 아니기 때문에 그것이 내가 그 점을 분명히하려는 이유라고 생각한다. –