检测对象的颜色,并改变它的颜色ios

我正在使用opencv边缘和轮廓检测来裁剪一些对象。 现在对象包含两个或更多的颜色,所以我必须逐一改变颜色,ecample我想改变苹果的颜色,并将其背景添加为图像,我该怎么做。

我想参考应用程序 ,但我不知道这一点。 我使用的链接相同,但坚持在第三或第四步,因为不知道如何掩盖颜色。 我用另一个链接,并写下如下给出的代码邻接找不到我的解决scheme。 任何链接或教程,然后请分享。

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)); } } 

我是这样做的 希望它能帮助别人:

 imageView.image=[UIImage imageNamed:@"test.png"]; cv::Mat img=[self cvMatFromUIImage:imageView.image]; cv::Mat hsvImage=cvCreateImage(img.size(),8, 3); cv::cvtColor(img, hsvImage, CV_BGR2HSV); std::vector<cv::Mat>channels; cv::split(hsvImage, channels); cv::Mat hue = channels[0]; cv::Mat dest; cv::Mat temp=cvCreateImage(img.size(), 8, 3); cv::inRange(hsvImage, cv::Scalar(90,50,50), cv::Scalar(130,255,255), dest); cv::merge(channels, temp); temp.setTo(cv::Scalar(60,255,255),dest); cv::split(temp, channels); cv::merge(channels, dest); cv::cvtColor(dest, hsvImage, CV_HSV2BGR); imageView.image=[self UIImageFromCVMat:hsvImage];