Как преобразовать определенный цвет в скалярное значение HSV / RGB (канал 4)? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь реализовать функцию изменения цвета для моего приложения для рисования.Вот некоторые оригинальные и ожидаемые результаты.

Исходное изображение: https://imgur.com/a/tSuqpIq

Требуется вывод: https://imgur.com/a/HG3awEW

Здесь мы опробовали несколько подходов для достижения этих решений:

  1. Рендеринг изображения с использованием «CIFilter»
  2. Замена цвета изображения Pixel Wise со значением допуска.
  3. Цвет заливки заливки (Не соответствует требованиям клиента, Не заливка цвета альфа-каналом)
  4. 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;
}

Почему он возвращает только синий цвет, даже если я устанавливаю другое скалярное значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...