2013-06-05 79 views
1

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

我想要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)); 
    } 
} 
+0

你为什么不只是编辑你问前两天的问题http://stackoverflow.com/questions/16918422/mask-color-and-replace-with-some- another-color-opencv-ios? – Bull

回答

1

我这样做了。希望这将帮助别人:

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]; 
+0

你能解释一下吗?我是这个领域的新手,尤其是开放式的cv。 – slaveCoder

+0

什么是cv :: inRange(hsvImage,cv :: Scalar(90,50,50),cv :: Scalar(130,255,255),dest)中的值; – slaveCoder

+0

此代码正在检测红色,但它占用太多内存和崩溃。如何纠正它? – slaveCoder