从对象中检测颜色并更改其颜色ios [英] detect colors from object and change its color ios

查看:165
本文介绍了从对象中检测颜色并更改其颜色ios的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using opencv edge and contour detection to crop some objects. now thatt object contain two or more colors so I have to change that colors one by one, for ecample I want to change color of apple and add its background as image so how can I do that.

我正在尝试 referenve app ,但我不知道这个。我使用了链接,但由于不知道如何掩盖颜色,因此陷入了第三或第四步。彼此链接我使用并编写下面给出的代码,但找不到我的解决方案。
然后请分享任何链接或教程。

I am trying like referenve app , but I have no idea about this. I used the link for same but stuck in third or fourth steps as don't know how to mask color. one another link I used and write code as given below abut not find my solution. Any link or tutorials then please share.

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


推荐答案

我以这种方式完成。希望它可以帮助某人:

I done it in this way. Hope it would help someone:

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

这篇关于从对象中检测颜色并更改其颜色ios的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆