Перейти к содержимому
Compvision.ru
NikitaBulygin

Реализация функции с python на с++

Recommended Posts

Добрый день ! Задача стоит реализовать замену лиц, столкнулся с проблемой переноса цвета кожи и бликов. Нашел данную статью тут , исходники. Пишу на c++, к сожалению с python не работал ни разу, поэтому сложно переносить код на с++. На данный момент мне нужно только функция "correct_colours" вот она на python :

def correct_colours(im1, im2, landmarks1):
    print RIGHT_EYE_POINTS;
    a1 = landmarks1[LEFT_EYE_POINTS];
    blur_amount = COLOUR_CORRECT_BLUR_FRAC * numpy.linalg.norm(
                              numpy.mean(landmarks1[LEFT_EYE_POINTS], axis=0) -
                              numpy.mean(landmarks1[RIGHT_EYE_POINTS], axis=0))
                              
    blur_amount = int(blur_amount)
    if blur_amount % 2 == 0:
        blur_amount += 1
 
        im1_blur = cv2.GaussianBlur(im1, (blur_amount, blur_amount), 0)
    im2_blur = cv2.GaussianBlur(im2, (blur_amount, blur_amount), 0)
    
    cv2.imwrite('im1_blur.jpg', im1_blur)
    cv2.imwrite('im2_blur.jpg', im2_blur)
    
    # Avoid divide-by-zero errors.
    im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype)    
    
    return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) /
                                                im2_blur.astype(numpy.float64))

 

Вот как я ее реализовал на с++:

void correct_colours(Mat &im1,Mat &im2,vector<Point2f> points2)
{
    
    arma::mat leftEye(EYE_POINTS_COUNT,2);
    for(int i = 0; i < EYE_POINTS_COUNT; i++)
    {
        leftEye(i,0) = (double)points2[LEFT_EYE_POINTS].x;
        leftEye(i,1) = (double)points2[LEFT_EYE_POINTS].y;
    }
    
    arma::mat rightEye(EYE_POINTS_COUNT,2);
    for(int i = 0; i < EYE_POINTS_COUNT; i++)
    {
        rightEye(i,0) = (double)points2[RIGHT_EYE_POINTS].x;
        rightEye(i,1) = (double)points2[RIGHT_EYE_POINTS].y;
    }
    arma::mat B = arma::mean(leftEye,0);
    arma::mat C = arma::mean(rightEye,0);
    arma::mat D = C-B;
    int A = COLOUR_CORRECT_BLUR_FRAC*arma::norm(D);
    if (A % 2 == 0)
    {
       A += 1;
    }
    
    cv::Mat im1_blur;
    cv::Mat im2_blur;
    cv::Size size(A,A);
    cv::GaussianBlur(im1, im1_blur,size, 0);
    cv::GaussianBlur(im2, im2_blur,size, 0);
    //imshow("im1_blur", im1_blur);
    //imshow("im2_blur", im2_blur);
    Mat rezult = im2_blur.clone();
    
    uchar *p1,*p2,*p3,*p4;
    for(int row = 0; row < im2_blur.rows; ++row) {
        p1 = im1_blur.ptr(row);
        p2 = im2_blur.ptr(row);
        p3 = im2.ptr(row);
        p4 = rezult.ptr(row);
        for(int col = 0; col < im2_blur.cols; ++col) {
            if( (*p2) <= 1 )
            {
                *p2 = (*p2)+128;
            }
            (*p4) = (*p3) * (*p1) / (*p2);
        }
    }
    imshow("rez", rezult);

Но полученный результат на с++ не такой какой должен быть. Подскажите пожалуйста, что я делаю не так ? Думаю проблема иденну в последних двух строчках кода на python :

im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype)    
    
    return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) /
                                                im2_blur.astype(numpy.float64))

Но 3 день не могу сообразить что не так.

python_rezult.jpg

c++rezult.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×