2010-02-09 23 views
7

Dopo aver installato con successo opencv 2.0 con i collegamenti Python, sto iniziando a correre dei problemi e prima di andare avanti mi chiedevo se dovevo passare a un'altra opzione. Come dice l'ezod su questo post:Quale versione di python opencv dovrei usare?

"Come un avvertimento, a partire dalla versione 2.0, i nuovi collegamenti Python sono incompleti: molte funzioni che vorrei considerare mancanti piuttosto importanti.Nel frattempo, i binding SWIG sono a dir poco agonizzanti per funzionare con. I collegamenti ctypes-opencv (progetto di terze parti), a partire dalla versione 0.8.0, non supportano OpenCV 2.0. "

Quindi, dovrei fare il soldato con 2.0 o dovrei andare per i ctypes? Cosa mi sto perdendo in entrambi i modi?

Sto usando OSX, python 2.5 e voglio fare il monitoraggio in 2d di oggetti in movimento e né un esperto di python né di visione artificiale!

+0

Il tempo ha risolto il mio problema. L'attuale versione di opencv 2.2 ha una buona implementazione di Python. Infine tornando a questo progetto avendo installato opencv usando homebrew (vedi la pagina wiki su willowgarage per le istruzioni). – PhoebeB

+0

Si noti che (almeno al momento) l'installazione homebrew predefinita per opencv non installa i collegamenti C++ (opencv. *), Ma solo i collegamenti Cv dello spazio dei nomi cv. Inoltre, potresti voler installare prima ffmpeg. Lo spazio dei nomi opencv può essere disponibile anche in caso di installazione di alcuni pacchetti (SWIG, per esempio?) –

risposta

1

Sto usando un OpenCV 2.0 auto-compilato e il suo binding python incorporato. Fino ad ora mi mancavano 2 o 3 funzioni (ad esempio FindFundamentalMat). Se ottieni il codice sorgente di OpenCV trovi un file di testo interfaces/python/api che definisce il parametro e i tipi di ritorno per ogni funzione OpenCV disponibile da Python. Dopo la ricompilazione, un generatore automatico analizzerà questo file e costruirà l'estensione python. Per tutti i casi che ho riscontrato, ho trovato che aggiungere una definizione appropriata allo api per le funzioni di cui avevo bisogno, quindi ricompilare opencv, funzionava abbastanza bene.

+0

Riesci a vedere gli svantaggi di percorrere questa rotta invece di usare i ctype? – PhoebeB

+0

ctypes-opencv non funziona con OpenCV 2.0 afaik (non ha verificato però). Ne ho appena trovato uno nuovo, http://code.google.com/p/pyopencv/ Non l'ho mai provato ma sembra estremamente promettente! Sostiene di avere una buona integrazione numpy :-) – dudemeister

+0

Ho appena visto che pyopencv (link che ho postato) è basato su Boost.Python anziché su ctypes. Questa è una decisione molto buona in quanto i ctypes supportano solo il wrapping di funzioni piatto (non è possibile includere direttamente una classe C++, ma è necessario eseguire manualmente il wrapping degli oggetti C++ a mano). Ciò significa che pyopencv potrebbe essere ancora migliore poiché avvolge oggetti OpenCV reali (come Mat). Fornisce anche la sintassi per l'indicizzazione numpy direttamente nelle matrici OpenCV \ o/ – dudemeister

0

Si consiglia di utilizzare the official Python bindings to OpenCV 2.1 che, per quanto ho visto, ha la parità di funzionalità con le librerie C++. Molti di questi hanno un involucro pitone o una traduzione diretta dalla versione C++.

La documentazione OpenCV di Python non è completa come quella di C++, ma se ritieni che i vantaggi linguistici per la prototipazione valgano, sarai in grado di comprendere l'utilizzo di Python dallo C++ documentation.

Attenzione che gran parte del codice di esempio esistente che troverai proviene dalle versioni precedenti e non è compatibile (ad esempio ora tutto risiede nel pacchetto cv), ma non è difficile capire come aggiornarlo.

3

Una risposta tardiva. Se non devi dipendere dalle versioni precedenti e vuoi utilizzare OpenCV con Python, scegli l'ultima versione stabile. Oggi è OpenCV 2.3.1.

Il vantaggio principale di OpenCV ≥ 2.3 per Python utenti: un nuovo modulo cv2 in aggiunta alla vecchia (compatibile) Modulo cv. Il nuovo modulo cv2 è molto più pitone e non richiede allocazioni manuali di memoria per strutture di dati intermedi. Il vecchio modulo cv è più simile alla traduzione diretta dell'API C++.

Per esempio, confrontare il nuovo Python cv2.findContours (OpenCV ≥ 2.3):

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy 

Si richiede solo tre parametri, e in grado di gestire automaticamente tutte le allocazioni di memoria, restituisce solo il risultato finale. Solo una riga del codice utente.

vs.vecchi cv.FindContours:

FindContours(image, storage [, mode [, method [, offset]]]) -> None 

Si richiede all'utente di allocare esplicitamente "stoccaggio" prima della chiamata (+ 1 o 2 righe di codice). Non restituisce il risultato, ma lo salva nella memoria allocata (funziona come una lista collegata e l'utente deve scrivere un ciclo per estrarre i dati dall'archiviazione). Nel complesso, più a basso livello e più simile a C++ rispetto a Python. Almeno 4-5 linee di codice nel caso di uso comune, anziché solo una riga con il nuovo modulo cv2.

+0

anche alcune costanti non sono mappate. Soluzioni per trovarle qui: http://stackoverflow.com/questions/9661512/python-opencv-imwrite-cant-find-params/9934725#9934725 – Neon22