2013-07-05 1 views
2

OpenCV를 사용하는 초보자라는 말로 시작하겠습니다. 어떤 것들은 명백해 보일 수 있으며 일단 배울 것이 확실하다면 나에게 분명해질 것입니다.floodfilled 영역을 얻는 방법?

내 목표는 floodFill 기능을 사용하여 채워진 영역 만 포함하는 별도의 이미지를 생성하는 것입니다. 이 post을 살펴 봤지만 채워진 마스크를 채워진 색상으로 실제 BGRA 이미지로 변환하는 방법에 대해 약간 분실되어 있습니다. 게다가 채워진 영역 만 포함하도록 새로 채워진 이미지를 잘라야합니다. 나는 OpenCV가 그 트릭을 할 수있는 마법 같은 기능을 가지고 있다고 생각한다.
원본 이미지 :
enter image description here

채워진 이미지 : 만
enter image description here

채워진 영역 :
enter image description here

을 여기

내가 달성하기 위해 노력하고있어입니다

업데이트 07/07/13
다음 코드를 사용하여 별도의 이미지를 채울 수있었습니다. 그러나 필자는 채워진 영역을 얻는 최선의 방법을 찾아야합니다. 또한, 내 플러드 필 솔루션은 알파 값을 포함하는 이미지를 충전에 문제가 ...

static int floodFillImage (cv::Mat &image, int premultiplied, int x, int y, int color) 
{ 
    cv::Mat out; 

    // un-multiply color 
    unmultiplyRGBA2BGRA(image); 

    // convert to no alpha 
    cv::cvtColor(image, out, CV_BGRA2BGR); 

    // create our mask 
    cv::Mat mask = cv::Mat::zeros(image.rows + 2, image.cols + 2, CV_8U); 

    // floodfill the mask 
    cv::floodFill(
      out, 
      mask, 
      cv::Point(x,y), 
      255, 
      0, 
      cv::Scalar(), 
      cv::Scalar(), 
      + (255 << 8) + cv::FLOODFILL_MASK_ONLY); 

    // set new image color 
    cv::Mat newImage(image.size(), image.type()); 
    cv::Mat maskedImage(image.size(), image.type()); 

    // set the solid color we will mask out of 
    newImage = cv::Scalar(ARGB_BLUE(color), ARGB_GREEN(color), ARGB_RED(color), ARGB_ALPHA(color)); 

    // crop the 2 extra pixels w and h that were given before 
    cv::Mat maskROI = mask(cv::Rect(1,1,image.cols,image.rows)); 

    // mask the solid color we want into new image 
    newImage.copyTo(maskedImage, maskROI); 

    // pre multiply the colors 
    premultiplyBGRA2RGBA(maskedImage, image); 

    return 0; 
} 
+1

난 당신이 무엇을 요구 확실하지 않다가, 그 링크는 RGB 값이 될 것이다 이력서 :: 매트로 스틱 . 이미지 행렬이 어떻게 구성되는지 알고 있습니까? [이 링크] (http://stackoverflow.com/questions/8006706/opencv-resizing-and-cropping-image-according-to-pixel-value)는 특정 픽셀 값에 대해 자르기하는 방법을 보여줍니다. 특정 색상 – GPPK

+0

귀하의 게시물을 보내 주셔서 감사합니다. 나는 그 질문을 갱신했다. 나는 그것을 쓸 때 너무 피곤했다 :/너무 나쁜 투표를위한 나쁜 ... :(어쨌든 나는 그 게시물을보고 그들이 사용하는 것을 볼 것이다. – Jona

답변

0

당신이 다른 픽셀을 얻기 위해 두 이미지의 차이를 얻을 수있다.

차이가없는 픽셀은 0이고 다른 픽셀은 양수 값입니다.

cv::Mat A, B, C; 
A = getImageA(); 
B = getImageB(); 

C = A - B; 

핸들 경우 음의 값. (내가 귀하의 경우하지 추정)

관련 문제