在iOS中使用openCV进行图像处理

时间:2014-11-29 06:30:13

标签: ios opencv image-processing

我希望只保留红色像素,并使图像中的所有其他内容变暗。我想使用openCv。我设法使用以下代码过滤红色,感谢SO,detect colors from object and change its color ios

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

1 个答案:

答案 0 :(得分: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