LINUX.ORG.RU

Неужели Python более производителен чем C++ с getPerspectiveTransform?!

 , ,


0

6

Доброго времени суток.

Неужели Python более производителен чем C++ с getPerspectiveTransform?! Я попробовал два похожих исходника. C++

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
 
#include <opencv2/gpu/gpu.hpp>
 
#include <iostream>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
int main(int, char**) {
    VideoCapture cap(0);
 
    if (!cap.isOpened())
        return -1;
 
    cap.set(CV_CAP_PROP_FPS, 0.55);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 960);
 
    
    Point2f inputQuad[4];
    
    Point2f outputQuad[4];
    
    Mat lambda(2, 4, CV_64FC3);
 
    //Mat edges;
    namedWindow("edges", 1);
    for (;;) {
        Mat frame;
        cap >> frame;
 
 
        lambda = Mat::zeros(frame.rows, frame.cols, frame.type());
 
        inputQuad[0] = Point2f(-30, -60);
        inputQuad[1] = Point2f(frame.cols + 50, -50);
        inputQuad[2] = Point2f(frame.cols + 100, frame.rows + 50);
        inputQuad[3] = Point2f(-50, frame.rows + 50);
 
        outputQuad[0] = Point2f(0, 0);
        outputQuad[1] = Point2f(frame.cols - 1, 0);
        outputQuad[2] = Point2f(frame.cols - 1, frame.rows - 1);
        outputQuad[3] = Point2f(0, frame.rows - 1);
 
        lambda = getPerspectiveTransform(inputQuad, outputQuad);
 
        warpPerspective(frame, frame, lambda, frame.size());
 
        flip(frame, frame, 1);
        imshow("edges", frame);
        if (waitKey(30) >= 0)
            break;
    }   
    return 0;
}
}

и на Python

# -*- coding: utf-8 -*-
 
import cv2
import numpy as np
import time
 
 
cap = cv2.VideoCapture(0)
 
cap.set(3, cap.get(3))
cap.set(4, cap.get(4))
time.sleep(1 / 30)
 
 
while True:
    ret, img = cap.read()
    imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.VideoCapture(0).release()bash-3.2$
    ret,thresh = cv2.threshold(imgray,127,255,0)
    contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
 
    if cap.isOpened() == 0:
            cap.open(0)
 
    res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
    """ X, Y """
    pts1 = np.float32([[0,0],[700,0],[0,1100],[600,1100]])
    pts2 = np.float32([[50,0],[600,0],[0,1100],[600,1100]])
    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(res,M,(1250,550))
 
    dst = cv2.flip(dst, 1)
    cv2.namedWindow('input', cv2.WINDOW_NORMAL)
 
    cv2.imshow("input", dst)
 
    key = cv2.waitKey(10)
    if key == 27:
        break
 
cv2.destroyAllWindows()
cv2.VideoCapture(0).release()

И оказалось, что скриптовый python более производителен чем нативный c++ Т.е. на c++ сильные лаги.

В чем может быть причина?

Код и на python и c++ писал не сам, брал готовые примеры.

Спасибо.

Какого ответа ты ждёшь? Да, на плюсах можно написать медленный код, и?

В чём может быть причина?

В руках, очевидно

Gvidon ★★★★ ()
Последнее исправление: Gvidon (всего исправлений: 1)
import cv2
import numpy as np
import time

Эти модули на чистом питоне написаны?

anonymous ()

чем нативный c++

А питоновский cv2 тоже нативный.

risenshnobel ★★★ ()

Возможно косяк в cap.set(CV_CAP_PROP_FPS, 0.55);. В плюсовом коде ты ставишь низкий FPS, а в коде на питоне ты его вообще не трогаешь.

kim-roader ★★ ()
Ответ на: комментарий от kim-roader

Пробовал менять fps

Пробовал менять fps. Пробовал его вообще не указывать. Итог одинаковый. Для остальных, я понимаю, что питоне работа с opencv тоже организованна на нативных библиотеках. По итогу выходит, что в питоне они более оптимизированы чем в с++ ))))

HunterNomad ()

а тебя не смущает что алгоритмы у тебя разные.

на питоне ты работаешь с imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY), еще и threshold а в cpp прям с фреймом.

anonymous ()

уже пора писать интерпретатор c++ на python, посоны?

anonymous ()
Ответ на: комментарий от Siado
  • opencv написан на c++;
  • в примере python дёргает только opencv + маршалит туда сюда типы + считает ссылки;
  • таким образом автор утверждает, что c++ + немного накладных расходов на преобразованием типов из понятных питону в понятные крестам работает быстрее чем аналогичный код на c++.

    Вывод: видимо автор идиот, а код не аналогичный.

KblCb ★★★★★ ()
Ответ на: комментарий от KblCb

Вывод другой: numpy быстр. Быстр потому, что написан на Си. Как и треть питоновских модулей. Из всего кода именно нумпи славится своей производительностью, да и cv2, наверняка, написан на си/си++.

menangen ★★★★★ ()
Ответ на: комментарий от menangen

Да, cv написан на крестах. Но вот только скорость у него тут проседает, потому что он в первом случае с grayscale изображением работает, а во втором с цветным. А numpy у него почти и не используется

anonymous ()
Ответ на: комментарий от menangen

Нет. OpenCV написан на самых что ни на есть настоящих крестах. А быстрый numpy в этом коде не делает примерно ничего.

KblCb ★★★★★ ()
Ответ на: комментарий от KblCb

Нет. OpenCV написан на самых что ни на есть настоящих крестах.

Да ты как я погляжу, эксперт? Код-то глядел? Ты мне покажешь там кресты, а не дефолтный сишный говнокод запиханный в классики?

Я тебе даже больше скажу, 95% проектов, которые рандомные балаболки считают крестовыми - это си с классами.

TrueTsar1C ()
Ответ на: комментарий от anonymous

почитай как исполняется компилируемый и интерпретируемый код.

Вот и почитай

Siado ★★★★★ ()
Ответ на: комментарий от TrueTsar1C

Итого: существует мифический крестовый говнокод, который принципиально отличается от сишного говнокода запихнутого в классы, о котором все слышали хотя и никто не видел, но именно он где-то между строк закрался у ТСа в примере и тормозит. Ну ок.

Кресты как кресты: объекты есть, счётчики ссылок есть, аллокатор крестовый, даже полтора шаблона есть.

KblCb ★★★★★ ()

Это еще что, вот у меня тут код для интерполяции b-сплайнов на жабе работает местами быстрее аналогичного плейнсишного варианта. Сиплюсплюсный «наивный» вариант с std::vector'ами сливает вчистую обоим.

Midael ★★★★★ ()
Последнее исправление: Midael (всего исправлений: 2)

Да прибудет с вами срач Оби Ван.

anonymous ()
Ответ на: комментарий от KblCb

Итого: существует мифический крестовый говнокод, который принципиально отличается от сишного говнокода запихнутого в классы, о котором все слышали хотя и никто не видел, но именно он где-то между строк закрался у ТСа в примере и тормозит. Ну ок.

Щито?

Есть крестовый код, а есть сишный. То, что кресты основаны на кастрированной сишке не наделяет сишный код пренадлежностью к крестам. Это банальная подмена понятий крестовых бабуинов ради создания видимости ахриненной популярности плюсов.

Меня не интересует ТС и его говно. Меня интересует только твоё утверждение.

У нас есть код, стиль которого кардинально противоречит мейнстримному крестовому, да и вообще всей крестовой ветви. Как его можно причислить к крестовому коду, если он вообще вне мейнстрима, да и вообще вне крестовой ветви?

Поэтому принадлежность чего-то к чему-то определяет большая, основная часть.

Кресты как кресты:

Покажи.

объекты есть

Что такое объекты - классики?

счётчики ссылок есть

Причем тут счетчики ссылок? Типа сказать нечего - надо херню сморозить? Когда это счётчик ссылок стал признаком крестов?

аллокатор крестовый

Причем тут аллокатор? Крестовый там не аллокатор, а new. Это часть кастыльной обвязки классиков, а про классики я уже сказал.

Там на крестах написаны более-менее некоторые модули, а так их там нет. Да и то, кресты там на уровне крестового рефакторинга уровня левой ноги, аля как в гцц.

Щас модно это делать, аля пихаем везде вектора и заменяем циклы на форичи/«алгоритмы».

Собственно сам Си с классами взялся оттудаже, типа стали модны классы и весь сишный код перерефакторили в классики.

даже полтора шаблона есть.

Ахриненная история.

TrueTsar1C ()
Ответ на: комментарий от cyanide_regime

throwJavaException

Куллстори. Чисто прокси в експшпены для всяких жаб.

return (ImfHeader *) new Imf::Header;

Сишные касты. Сишный (void).

Да и вообще левый проект https://github.com/openexr/openexr/blob/master/OpenEXR/IlmImf/ImfCRgbaFile.cpp

Itseez/opencv – DetectionBasedTracker_jni.cpp

Семпл.

Itseez/opencv – AdvancedCapture.xaml.cpp

Семпл.

Itseez/opencv – ImfTestFile.cpp

Тот же левый проект.

Itseez/opencv – test_gpumat.cpp

Тесты, не код.

Itseez/opencv – cap_giganetix.cpp

Обёртка над другой либой, юзающей ексепшены.

Мне продолжить тебя в говно макать, питушок?

TrueTsar1C ()
Ответ на: комментарий от KblCb

И вступает аФтор

Я прощу у сообщества прощение. Во-пеовых Коды писал не я. Я их только опробовал. Во-вторых я должен был указать, что с++ я только начал изучать, а с питоном вообще не знаком. С++ изучаю три недели, а питон - день смотрел исходники. И по сему могу глубоко ошибаться. НО я никого ни разу не оскорбил. Чего и всем желаю :)

Стоит задача максимально быстро (т.е. без лагов) снимать видео с камеры и трансформировать его на выходе. Справедливости ради нужно сказать, что код на C++ мной был собран из двух примеров, первый это простой пример захвата видео, в второй это трансформация картинки и, по итогу, возможно не самый оптимальный/быстрый код.

HunterNomad ()
Ответ на: И вступает аФтор от HunterNomad

Но он точно стоил того, чтобы тащить его на форум. Держите нас в курсе ваших новых удивительных открытий.

Weres ★★★ ()
Ответ на: И вступает аФтор от HunterNomad

Из топ поста:

C++:

        if (waitKey(30) >= 0)
            break;

python:

    key = cv2.waitKey(10)
    if key == 27:
        break

Есть подозрение, что второе работает в 3 раза быстрее :) Советую сделать цифры одинаковыми.

Поговаривают, что можно задать еще мЕньшую задержку.

sf ★★ ()
Ответ на: комментарий от TrueTsar1C

так тебя макают мордой в говно, щенок.

https://github.com/search?p=5&q=repo:Itseez/opencv template&ref=searc...

идиотушка, ты внизу дальше одной страницы пролистни вот тебе try-catch ПРЯМА В КОДЕ1!!

https://github.com/Itseez/opencv/blob/6820292256dcd8b36ff1863cfdb9368ff3e7318...

https://github.com/Itseez/opencv/blob/7d4d28605087ec2d3878f9467aea313a2acdfd4...

https://github.com/Itseez/opencv/blob/7d4d28605087ec2d3878f9467aea313a2acdfd4...

дуй в курятник и не кукарекай.

cyanide_regime ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.