2017-10-18 9 views
1

iOS 앱의 OpenCV 웹 사이트에서 this sample을 재현하려고합니다.터치 이벤트를 iOS의 OpenCV 유역 알고리즘의 마커로 사용합니다.

setMouseCallbackHigh-level GUI은 논리적으로 iOS와 같은 모바일 플랫폼에서 사용할 수 없습니다.

그래서 내가 한 것은 사용자가 이미지 위에 그림을 그릴 수있게 한 다음 그림과 이미지를 OpenCV 처리 함수에 전달하는 것입니다.

다양한 시도를 한 후에 내 그림이 마커 마스크로 간주되지 않으므로 아마도 어딘가에서 실수를하는 것으로 보이고 드로잉 인수를 실제로 사용하지 않을 것입니다.

내 코드 :

- (UIImage *)watershedMAN:(UIImage *)imageRaw markers:(UIImage *)drawing { 
    Mat img, imgGray, markerMask, maskerMaskDrawn; 

    UIImageToMat(imageRaw, img); 
    UIImageToMat(drawing, maskerMaskDrawn); 

    cvtColor(img, markerMask, COLOR_BGR2GRAY); 
    cvtColor(markerMask, imgGray, COLOR_GRAY2BGR); 

    markerMask = Scalar::all(0); 

    // 
    // How to use 'maskerMaskDrawn' here? 
    // 

    int i, j, compCount = 0; 
    vector<vector<cv::Point> > contours; 
    vector<Vec4i> hierarchy; 

    findContours(markerMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); 

    Mat markers(markerMask.size(), CV_32S); 

    markers = Scalar::all(0); 

    int idx = 0; 
    for(; idx >= 0; idx = hierarchy[idx][0], compCount++) 
    { 
     drawContours(markers, contours, idx, Scalar::all(compCount+1), -1, 8, hierarchy, INT_MAX); 
    } 

    vector<Vec3b> colorTab; 
    for(i = 0; i < compCount; i++) 
    { 
     int b = theRNG().uniform(0, 255); 
     int g = theRNG().uniform(0, 255); 
     int r = theRNG().uniform(0, 255); 
     colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r)); 
    } 

    watershed(img, markers); 

    Mat wshed(markers.size(), CV_8UC3); 

    for(i = 0; i < markers.rows; i++) 
     for(j = 0; j < markers.cols; j++) 
     { 
      int index = markers.at<int>(i,j); 
      if(index == -1) 
       wshed.at<Vec3b>(i,j) = Vec3b(255,255,255); 
      else if(index <= 0 || index > compCount) 
       wshed.at<Vec3b>(i,j) = Vec3b(0,0,0); 
      else 
       wshed.at<Vec3b>(i,j) = colorTab[index - 1]; 
     } 

    wshed = wshed*0.5 + imgGray*0.5; 

    return MatToUIImage(wshed); 
} 

imageRaw and drawing arguments

들으.

답변

0

문제가 해결되었습니다.

먼저 UIImage 색 공간을 BRGA에서 BGR로 변환해야합니다. 그런 다음 내 그림의 배경이 분명하기 때문에 void UIImageToMat(const UIImage* image, cv::Mat& m, bool alphaExist = false);alphaExist을 true로 설정해야합니다.

- (UIImage *)watershedMAN:(UIImage *)imageRaw drawing:(UIImage *)drawingRaw { 
    Mat img0, img, imgGray, wshed, drawingMask; 

    UIImageToMat(imageRaw, img0); 
    cvtColor(img0, img0, CV_BGRA2BGR); 

    UIImageToMat(drawingRaw, drawingMask, true); 
    cvtColor(drawingMask, drawingMask, CV_BGRA2BGR); 

    img = img0.clone(); 
    imgGray = img0.clone(); 
    wshed = img0.clone(); 

    Mat markerMask(img.size(), CV_8UC1); 
    Mat markers(img.size(), CV_32SC1); 

    cvtColor(img, markerMask, CV_BGR2GRAY); 
    cvtColor(markerMask, imgGray, CV_GRAY2BGR); 

    wshed = Scalar::all(0); 
    markerMask = Scalar::all(0); 
    markers = Scalar::all(0); 

    cvtColor(drawingMask, drawingMask, CV_BGR2GRAY); 
    markerMask = markerMask + drawingMask; 

    int i, j, compCount = 0; 
    vector<vector<cv::Point>> contours; 
    vector<Vec4i> hierarchy; 

    findContours(markerMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); 

    int idx = 0; 
    for(; idx >= 0; idx = hierarchy[idx][0], compCount++) 
    { 
     drawContours(markers, contours, idx, Scalar::all(compCount+1), -1, 8, hierarchy, INT_MAX); 
    } 

    vector<Vec3b> colorTab; 
    for(i = 0; i < compCount; i++) 
    { 
     int b = theRNG().uniform(0, 255); 
     int g = theRNG().uniform(0, 255); 
     int r = theRNG().uniform(0, 255); 
     colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r)); 
    } 

    watershed(img0, markers); 

    for(i = 0; i < markers.rows; i++) 
     for(j = 0; j < markers.cols; j++) 
     { 
      int index = markers.at<int>(i,j); 
      if(index == -1) 
      { 
       wshed.at<Vec3b>(i,j) = Vec3b(255,255,255); 
      } 
      else if(index <= 0 || index > compCount) 
      { 
       wshed.at<Vec3b>(i,j) = Vec3b(0,0,0); 
      } 
      else 
      { 
       wshed.at<Vec3b>(i,j) = colorTab[index - 1]; 
      } 
     } 

    wshed = wshed*0.5 + imgGray*0.5; 

    return MatToUIImage(wshed); 
} 
:

여기 내 작업 코드입니다