붉은 색 픽셀 만 유지하고 이미지의 모든 것을 어둡게하려고합니다. 그리고 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];
'CV : 매트 hsvImage = cvCreateImage (img.size(), 8, 3),''일반 CV : 매트 hsvImage되어야한다'. cvCreateImage는 비밀스런 c-api에서 왔기 때문에 C++로 OutputArrays를 미리 할당 할 필요가 없습니다. (그리고 C와 C++ API를 혼합하는 것은 opencv에서 끔찍한 생각이다.) – berak
@berak, 답장을 보내 주셔서 감사합니다. 나는 c-apis에 익숙하지 않다. 임시 매트를 붉은 색의 역으로하고 싶습니다. – Matt
다시, 그것은 단지 사소한 의견입니다. 그냥 cvCreateImage 호출을 버리십시오. 그래서 - 빨간색이 아닌 것을 가려 내고 싶습니까? – berak