opencv 가장자리 및 등고선 감지 기능을 사용하여 일부 오브젝트를 자릅니다. 이제는 thatt 객체가 두 개 이상의 색상을 포함하므로 하나씩 색상을 변경해야합니다. 예를 들어 apple의 색상을 변경하고 배경을 이미지로 추가하고 싶습니다. 어떻게 할 수 있습니까?오브젝트의 색상을 감지하고 색상을 변경합니다.
나는 referenve app과 같은 시도를하고 있지만 이것에 대해서는 전혀 모른다. 나는 link을 동일하게 사용했지만 색상을 마스크하는 방법을 모르기 때문에 세 번째 또는 네 번째 단계에서 멈추었습니다. 서로 link 아래에 주어진 코드를 사용하고 작성하면 내 해결책을 찾지 못한다. 링크 또는 자습서를 공유 한 다음 공유하십시오.
IplImage *image=[self CreateIplImageFromUIImage:[UIImage imageNamed:@"mask.png"]];
IplImage *hsvImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
cvCvtColor(image,hsvImage,CV_RGB2HSV);
NSLog(@"size is %dx%d",cvGetSize(image).width,cvGetSize(image).height);
IplImage *hChannel = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
IplImage *sChannel = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
IplImage *vChannel = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvSplit(hsvImage, hChannel, sChannel, vChannel, NULL);
IplImage *cvinRangeOut=cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvinRangeOut=[self inRangeImage:hsvImage];
IplImage *dest = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
IplImage *temp = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
cvMerge(hChannel, sChannel, NULL, NULL, temp);
cvSet(hsvImage, cv::Scalar(255,0,0),cvinRangeOut);// destination hue and sat
cvSplit(hsvImage, hChannel, sChannel, NULL, NULL);
cvMerge(hChannel, sChannel, vChannel, NULL, dest);
cvCvtColor(dest, dest, CV_HSV2BGR);
imageView2.image=[self UIImageFromIplImage:dest];
}
-(IplImage *)inRangeImage:(IplImage *)image
{
CvScalar source=CvScalar() ;//source color to replace
IplImage *cvInRange = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
CvScalar from=getScaler(source,false);
CvScalar to=getScaler(source, true);
cvInRangeS(image, from, to, cvInRange);
return cvInRange;
}
CvScalar getScaler(CvScalar seed,Boolean plus){
if(plus){
NSLog(@"rgb are %f, %f %f",seed.val[0],seed.val[1],seed.val[2]);
NSLog(@"seeds are %f %f %f",seed.val[0]+(seed.val[0]* (int)cv::threshold),seed.val[1]+(seed.val[1]*(int)cv::threshold),seed.val[2]+(seed.val[2]* (int)cv::threshold));
return CV_RGB(seed.val[0]+(seed.val[0]*(int)cv::threshold),seed.val[1]+(seed.val[1]*(int)cv::threshold),seed.val[2]+(seed.val[2]* (int)cv::threshold));
}else{
NSLog(@"seeds are %f %f %f",seed.val[0]-(seed.val[0]*(int)cv::threshold),seed.val[1]-(seed.val[1]*(int)cv::threshold),seed.val[2]-(seed.val[2]* (int)cv::threshold));
return CV_RGB(seed.val[0]-(seed.val[0]*(int)cv::threshold),seed.val[1]-(seed.val[1]*(int)cv::threshold),seed.val[2]-(seed.val[2]* (int)cv::threshold));
}
}
http://stackoverflow.com/questions/16918422/mask-color-and-replace-with-some- another-color-opencv-ios? – Bull