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

NikitaBulygin

Пользователи
  • Количество публикаций

    1
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О NikitaBulygin

  • Звание
    Новичок
  1. Реализация функции с python на с++

    Добрый день ! Задача стоит реализовать замену лиц, столкнулся с проблемой переноса цвета кожи и бликов. Нашел данную статью тут , исходники. Пишу на 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 день не могу сообразить что не так.
×