2013-06-05 2 views
1

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

설명해 주시겠습니까? 저는이 분야와 특히 open-cv에 익숙하지 않습니다. – slaveCoder

+0

cv :: inRange (hsvImage, cv :: Scalar (90,50,50), cv :: Scalar (130,255,255), dest)의 값은 무엇입니까? – slaveCoder

+0

이 코드는 붉은 색을 감지하고 있습니다. 그러나 너무 많은 메모리를 사용하고 충돌합니다. 어떻게 수정합니까? – slaveCoder

관련 문제