我正在尝试为我的绘画应用程序实现颜色更改功能。这是一些原始的和预期的结果。
原始图片: https://imgur.com/a/tSuqpIq
要求输出: https://imgur.com/a/HG3awEW
在这里,我们尝试了多种方法来实现此解决方案:
我被困在可以找到特定颜色范围并替换为另一种颜色的地方。
我们编写了一个代码,用于在两者之间桥接代码后用OpenCV和目标C替换另一种颜色。
它们的灰度和其他方法正常工作(例如边缘检测)。但是,当用任何HSV和RGB值替换颜色时,它仅返回图像中的蓝色值。颜色也散布在椅子和其他物体上。
结果如下: https://imgur.com/7SUNuf4
-(UIImage *)ChangeColor:(UIImage *)processedImage col:(UIColor *)color {
UIColor *color1 = [self lighterColorForColor:color];
UIColor *color2 = [self darkerColorForColor:color];
UIColor *color3 = [self setColor:[arrForColor objectAtIndex:selectedColor] alpha:1.0];
[color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
[color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
[color3 getRed:&r3 green:&g3 blue:&b3 alpha:&a3];
CGFloat r1, g1, b1, a1, r2, g2, b2, a2, r3, g3, b3, a3;
[color1 getHue:&r1 saturation:&g1 brightness:&b1 alpha:nil];
[color2 getHue:&r2 saturation:&g2 brightness:&b2 alpha:nil];
[color3 getHue:&r3 saturation:&g3 brightness:&b3 alpha:nil];
r1 = r1 * 255;
r2 = r2 * 255;
r3 = r3 * 255;
g1 = g1 * 255;
g2 = g2 * 255;
g2 = g3 * 255;
b1 = b1 * 255;
b2 = b2 * 255;
b3 = b3 * 255;
cv::Mat img=[MMOpenCVHelper cvMatFromUIImage:processedImage];
cv::Mat hsvImage = cv::cvarrToMat(cvCreateImage(img.size(),8, 3));
cv::cvtColor(img, hsvImage, CV_BGR2HSV);
std::vector<cv::Mat>channels;
cv::split(hsvImage, channels);
cv::Mat hue = channels[0];
cv::Mat dest;
cv::Mat temp= cv::cvarrToMat(cvCreateImage(img.size(), 8, 3));
cv::inRange(hsvImage, cv::Scalar(10,10,10), cv::Scalar(20,20,20), dest);
cv::merge(channels, temp);
temp.setTo(cv::Scalar(50,50,50),dest);
cv::split(temp, channels);
cv::merge(channels, dest);
cv::cvtColor(dest, hsvImage, CV_HSV2RGB);
UIImage *grayeditImage=[MMOpenCVHelper UIImageFromCVMat:hsvImage];
return grayeditImage;
}
- (UIColor *)lighterColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MIN(r + 0.1, 1.0)
green:MIN(g + 0.1, 1.0)
blue:MIN(b + 0.1, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MAX(r - 0.1, 0.0)
green:MAX(g - 0.1, 0.0)
blue:MAX(b - 0.1, 0.0)
alpha:a];
return nil;
}
为什么即使我设置了不同的标量值,它也只返回蓝色?