0

기본적으로 이미지를 흑백 이음매없는 이미지로 변환하는 게임을 만들려고 iOS 및 OpenCV로 놀고 있습니다. 영역이 있으며 화면의 한 번만 탭하여이 영역을 채울 수 있습니다. 지금까지 부분적으로 성공했습니다. 변환 작업은 정상적으로 작동하지만 구체적인 채색 가능 영역 (닫힌 영역)이있는 이미지를 만드는 데 어려움이 있습니다.OpenCV 및 iOS로 닫힌 영역을 만드는 동안 이미지를 색상으로 변환합니다.

심지어 가능합니까? 대체 방법/아이디어가 아니라면 무엇을 제안합니까? 나는 둘이 있지만 나는 좋아하지 않는다.
    - 우리가
    변환 후 그림으로 영역을 정의 - 탭을 화면에 단지 X 픽셀의 재귀 검색을 수행

예 : 이 Dropbox pics

가 어떤 건설적인 도움이 크게 감사합니다!

내 뷰 컨트롤러의 관련 부분 :

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    imageProcessor = [[Conversion alloc] init]; 

    _image = [UIImage imageNamed:@"lenna"]; 
    imageProcessor.thresholdSlider = self.thresholdSlider; 
    imageProcessor.thresholdSlider2 = self.thresholdSlider2; 

    self.imageView.image = [imageProcessor convertImage:_image]; 
} 

- (IBAction)sliderChanged:(id)sender { 
    self.imageView.image = [imageProcessor convertImage:_image]; 
} 

그리고 당신은이 단계를 수행 할 수 OpenCV의

- (UIImage*)convertImage:(UIImage*)image{ 

    cv::Mat src; 
    cv::Mat src_gray; 

    //Convert UIImage to cv::Mat 
    src = [self cvMatFromUIImage:image]; 

    if (!src.empty()) { 
     //Convert cv::Mat to grayscale 
     cv::cvtColor(src, src_gray, CV_RGBA2GRAY); 
     cv::blur(src_gray, src_gray, cv::Size(3,3)); 

     cv::Mat canny_output; 
     cv::vector<cv::vector<cv::Point> > contours; 
     cv::vector<cv::Vec4i> hierarchy; 

     int thresh = (int)self.thresholdSlider.value; 
     int thresh2 = (int)self.thresholdSlider2.value; 

     NSLog(@"%d, %d", thresh, thresh2); 

     //Detect edges using canny 
     //http://en.wikipedia.org/wiki/Canny_edge_detector 
     cv::Canny(src_gray, canny_output, thresh, thresh2, 3, true); 

     //InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, 
     //Point offset = Point()) 
     cv::findContours(canny_output, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE, cv::Point(0,0)); 

     cv::Scalar blackColor = cv::Scalar::all(0); 
     cv::Scalar whiteColor = cv::Scalar::all(255); 

     //create a WHITE Mat with the canny_output size 
     cv::Mat drawing(canny_output.size(), CV_8UC3, whiteColor); 
     for (size_t i = 0; i < contours.size(); i++) { 
      //InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar &color, int thickness = 1, 
      //int lineType = 8, InputArray hierarchy = noArray(), int maxLevel = 2147483647, Point offset = Point()) 
      cv::drawContours(drawing, contours, int(i), blackColor, 1, CV_AA, hierarchy, INT_MAX, cv::Point()); 
     } 
     return [self UIImageFromCVMat:drawing]; 

    } 
    return nil; 
} 

답변

1

사용하여 변환 클래스의 관련 부분,

  1. 찾기 윤곽.

  2. 각 윤곽에 대해 설명 된대로 닫혀 있는지 여부를 확인한 후 here을 누른 다음 적절한 색으로 윤곽을 그립니다.

+0

고마워요! 나는 그것을 시도 할 것이고, 나는 그것을 대답으로 표시하거나 더 많이 물을 것이다. :) – farkasseb

관련 문제