【问题标题】:Image processing with openCV in iOS在 iOS 中使用 openCV 进行图像处理
【发布时间】:2014-11-29 16:44:00
【问题描述】:

我希望仅保留红色像素并使图像中的其他所有内容变暗。我想使用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];

【问题讨论】:

  • cv::Mat hsvImage = cvCreateImage(img.size(),8, 3); 应该是一个普通的 cv::Mat hsvImage; 。 cvCreateImage 来自神秘的 c-api,您不必在 c++ 中预先分配 OutputArrays。 (并且将 c 和 c++ api 与 opencv 混合是一个可怕的想法)
  • @berak,感谢您的回复。我对c-apis不熟悉。我希望 temp Mat 与红色相反。
  • 再次,这只是一个小评论.. 只需放弃 cvCreateImage 调用。所以 - 你想“掩盖”任何非红色的东西吗?
  • 是的,我想屏蔽掉非红色

标签: ios opencv image-processing


【解决方案1】:

您可能不需要拆分/合并通道。为什么不从简单的开始,用 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);

【讨论】:

  • 对不起,我太笨了,我收到了这个错误“操作既不是'array op array'(数组具有相同的大小和类型),也不是'array op scalar',也不是函数 binary_op 中的“标量运算数组”。异常点在“cv::bitwise_and(img ,maskRgb ,result);”中
  • 谢谢。我只是稍微调整了一下,它起作用了,我不确定它是否正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2012-12-12
  • 2016-09-26
  • 2015-05-10
相关资源
最近更新 更多