【发布时间】: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