Я пытаюсь реализовать функцию изменения цвета для моего приложения для рисования.Вот некоторые оригинальные и ожидаемые результаты.
Исходное изображение: https://imgur.com/a/tSuqpIq
Требуется вывод: https://imgur.com/a/HG3awEW
Здесь мы опробовали несколько подходов для достижения этих решений:
- Рендеринг изображения с использованием «CIFilter»
- Замена цвета изображения Pixel Wise со значением допуска.
- Цвет заливки заливки (Не соответствует требованиям клиента, Не заливка цвета альфа-каналом)
- OpenCV.
Я застрял в точке, где мы можем найти диапазон определенного цвета и заменить его другим.
Мы создали код для замены цвета другим с 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;
}
Почему он возвращает только синий цвет, даже если я устанавливаю другое скалярное значение?