저는 OpenCV 및 C++의 초보자입니다. 그러나 이제는이 문제에 대한 해결책을 찾아야합니다. 파란색 배경을 가진 사람의 이미지가 있습니다. 이제 배경을 빼야합니다. 이미지에서 다른 이미지로 바꿉니다. 는 지금은이 문제를 해결하는 두 가지 방법이 있습니다 생각하지만, 내가 더 알고하지 않습니다OpenCV C++에 의해 이미지에서 파란색 배경을 뺍니다
해결 방법 1 :
- 변환 이미지 & W
- 이로 사용 B로 배경을 감추는 마스크
솔루션이는 :
배경을 찾을 coutour를 사용- ,
- 한 다음를 뺍니다.
이미 해결책 1로 구현했지만 그 결과는 예상대로 아닙니다. 다른 더 나은 해결책이 있거나 이미 소스 코드로 구현 한 사람이 있습니까? 귀하의 도움에 감사드립니다.
여기 내 소스 코드를 업데이트, 당신은 배경이 파란색 알고 있다면, 당신은/W을 B로 이미지를 변환하여 귀중한 정보를 잃고 몇 가지 코멘트를 나에게
//Get the image with person
cv::Mat imgRBG = imread("test.jpg");
//Convert this image to grayscale
cv::Mat imgGray = imread("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);
//Get the background from image
cv::Mat background = imread("paris.jpg");
cv::Mat imgB, imgW;
//Image with black background but inside have some area black
threshold(imgGray, imgB, 200, 255, CV_THRESH_BINARY_INV);
cv::Mat imgTemp;
cv::Mat maskB, maskW;
cv::Mat imgDisplayB, imgDisplayW;
cv::Mat imgDisplay1, imgDisplay2, imgResult;
//Copy image with black background, overide the original image
//Now imgTemp has black background wrap the human image, and inside the person, if there're some white area, they will be replace by black area
imgRBG.copyTo(imgTemp, imgB);
//Now replace the black background with white color
cv::floodFill(imgTemp, cv::Point(imgTemp.cols -10 ,10), cv::Scalar(255.0, 255.0, 255.0));
cv::floodFill(imgTemp, cv::Point(10,10), cv::Scalar(255.0, 255.0, 255.0));
cv::floodFill(imgTemp, cv::Point(10,imgTemp.rows -10), cv::Scalar(255.0, 255.0, 255.0));
cv::floodFill(imgTemp, cv::Point(imgTemp.cols -10,imgTemp.rows -10), cv::Scalar(255.0, 255.0, 255.0));
//Convert to grayscale
cvtColor(imgTemp,imgGray,CV_RGB2GRAY);
//Convert to B&W image, now background is black, other is white
threshold(imgGray, maskB, 200, 255, CV_THRESH_BINARY_INV);
//Convert to B&W image, now background is white, other is black
threshold(imgGray, maskW, 200, 255, CV_THRESH_BINARY);
//Replace background of image by the black mask
imgRBG.copyTo(imgDisplayB, maskB);
//Clone the background image
cv::Mat overlay = background.clone();
//Create ROI
cv::Mat overlayROI = overlay(cv::Rect(0,0,imgDisplayB.cols,imgDisplayB.rows));
//Replace the area which will be human image by white color
overlayROI.copyTo(imgResult, maskW);
//Add the person image
cv::addWeighted(imgResult,1,imgDisplayB,1,0.0,imgResult);
imshow("Image Result", imgResult);
waitKey();
return 0;
봅니다 분할. 테두리에 매우 가까운 전경 마스크를 사용하여 cv :: grabCut을 사용하십시오 (예 : 이미지의 4 픽셀을 전경으로 설정). – William
친애하는 William. 더 자세하게 설명해 줄 수 있습니까? 이 상황에서 어떻게 grabCut을 사용할 수 있습니까? 감사합니다 – user2411800
읽기 [이] (http://www.packtpub.com/article/opencv-segmenting-images) 및 시도 [this] (http://stackoverflow.com/questions/14111716/how-to-set-a -mask-image-for-grabcut-in-opencv). – William