2017-10-18 48 views
1

我試圖在OpenCV網站上覆制this sample在iOS應用上。在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

THX。

回答

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); 
}