2014-11-29 2 views
0

붉은 색 픽셀 만 유지하고 이미지의 모든 것을 어둡게하려고합니다. 그리고 openCv를 사용하고 싶습니다. 나는, SO에 detect colors from object and change its color iosiOS에서 openCV로 이미지 처리

// Create Mat from UIimage 
cv::Mat img = [self cvMatFromUIImage:[UIImage imageNamed:@"rgb1.jpg"]]; 
// Convert to HSV 
cv::Mat hsvImage = cvCreateImage(img.size(),8, 3); 
cv::cvtColor(img, hsvImage, CV_BGR2HSV); 

std::vector<cv::Mat>channels; 

// splitting the channels of HSV 
cv::split(hsvImage, channels); 
// Getting only the hue from channels 
cv::Mat hue = channels[0]; 
// Creating a temporary image using the hue 
cv::Mat dest; 
cv::Mat temp = cvCreateImage(img.size(), 8, 3); 

// Giving the threshold range 
cv::inRange(hsvImage, cv::Scalar(90,50,50), cv::Scalar(130,255,255), dest); 

// I guess image temp Image and Original image gets merged here 
// I would appreciate some explanation here 
cv::merge(channels, temp); 
temp.setTo(cv::Scalar(90,50,50),dest); 
cv::split(temp, channels); 
cv::merge(channels, dest); 

// Converting the HSV Image back to BGR 
cv::cvtColor(dest, hsvImage, CV_HSV2BGR); 
// Converting Mat to UIImage 
self.imageView.image=[self UIImageFromCVMat:hsvImage]; 

빨간색 아래의 코드를 사용하여 색상, 감사를 필터링하는 데 성공하지만 그대로 붉은 색을 유지하고 어둡게 또는 나머지 색상을 흐리게합니다. 나는 그 역 행위를 ​​어디에서 만들어야하는지, 그것을 어떻게해야하는지 혼란 스럽다.

도움을 주시면 감사하겠습니다. 업데이트

: 나를 위해 일한

코드, 거기 밖으로 누군가가 도움이되기를 바랍니다.

cv::Mat img = [self cvMatFromUIImage:[UIImage imageNamed:@"rgb1.jpg"]]; 
cv::Mat hsvImage; 
cv::cvtColor(img , hsvImage, CV_BGR2HSV); 

cv::Mat mask; 
cv::inRange(hsvImage, cv::Scalar(90,50,50), cv::Scalar(130,255,255), mask); // This picks red color 
// cv::inRange(hsvImage, cv::Scalar(0,50,50), cv::Scalar(30,255,255), mask); // This picks blue color 

self.imageView.image = [self UIImageFromCVMat:mask]; 

cv::Mat maskRgb; 
cv::cvtColor(mask, maskRgb, CV_GRAY2BGR); 

cv::Mat result; 
// cv::bitwise_and(img ,maskRgb ,result); // @berak but app crashed at this line 
img.copyTo(result, mask); // This line writes the new masked image over the original image, I'm not sure if thats the right way instead of bitwise_and??? 
self.imageView1.image = [self UIImageFromCVMat:result]; 
+0

'CV : 매트 hsvImage = cvCreateImage (img.size(), 8, 3),''일반 CV : 매트 hsvImage되어야한다'. cvCreateImage는 비밀스런 c-api에서 왔기 때문에 C++로 OutputArrays를 미리 할당 할 필요가 없습니다. (그리고 C와 C++ API를 혼합하는 것은 opencv에서 끔찍한 생각이다.) – berak

+0

@berak, 답장을 보내 주셔서 감사합니다. 나는 c-apis에 익숙하지 않다. 임시 매트를 붉은 색의 역으로하고 싶습니다. – Matt

+0

다시, 그것은 단지 사소한 의견입니다. 그냥 cvCreateImage 호출을 버리십시오. 그래서 - 빨간색이 아닌 것을 가려 내고 싶습니까? – berak

답변

0

분할/병합 통과는 필요하지 않습니다. 왜 모든 간단한 시작하고 inRange, hsv 이미지 마스크를 만들고 이미지에 적용 할?

cv::Mat hsvImage; 
cv::cvtColor(img , hsvImage, CV_BGR2HSV); 

Mat mask; // red is on the left side of the [0..180] hue range 
cv::inRange(hsvImage, cv::Scalar(0,50,50), cv::Scalar(30,255,255), mask); 

cv::Mat maskRgb; // make a 3channel mask 
cv::cvtColor(mask, maskRgb, CV_GRAY2BGR); 

Mat result; 
bitwise_and(img ,maskRgb ,result); 

enter image description here

enter image description here

+0

정말 바보 취급을해서 미안 해요.이 작업은 '배열 op 배열'(배열의 크기와 유형이 같음)이나 '배열 연산 스칼라 '또는'함수 binary_op의 '스칼라 op 배열'이 아닙니다. 예외 점은 "cv :: bitwise_and (img, maskRgb, result);"에 있습니다. – Matt

+0

감사합니다. 나는 조금만 비틀었다. 그리고 그것이 효과가 있었다, 나는 그것이 바른 길인지 확실하지 않다. – Matt