【发布时间】:2014-03-02 07:48:36
【问题描述】:
我正在使用 opencv 边缘和轮廓检测来裁剪一些对象。现在该对象包含两种或多种颜色,所以我必须一一更改颜色,对于 ecample,我想更改 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));
}
}
【问题讨论】:
-
你为什么不编辑你两天前问的问题stackoverflow.com/questions/16918422/…?
标签: ios opencv image-processing