2014-12-31 8 views
11

Ho due immagini stereo che mi piacerebbe usare per calcolare una mappa di profondità. Mentre sfortunatamente non conosco C/C++, conosco python-- quindi quando ho trovato this tutorial, ero ottimista.Python/OpenCV dell'attività: una mappa di profondità da immagini stereo

Purtroppo, il tutorial sembra essere un po 'fuori data. Non solo deve essere ottimizzato per funzionare (rinominare 'createStereoBM' in 'StereoBM') ma quando viene eseguito, non dà un buon risultato, anche sulle immagini stereo di esempio che sono state utilizzate nel tutorial stesso .

Ecco un esempio:

image-left image-right

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

imgL = cv2.imread('Yeuna9x.png',0) 
imgR = cv2.imread('SuXT483.png',0) 

stereo = cv2.StereoBM(1, 16, 15) 
disparity = stereo.compute(imgL, imgR) 

plt.imshow(disparity,'gray') 
plt.show() 

Il risultato:

the result

Questo sembra molto diverso da quello che l'autore del tutorial raggiunge:

good result http://docs.opencv.org/trunk/_images/disparity_map.jpg

Modificare i parametri non migliora le cose. Tutta la documentazione che sono stato in grado di trovare è per la versione C originale del codice openCV, non l'equivalente della libreria Python. Purtroppo non sono stato in grado di usarlo per migliorare le cose.

Qualsiasi aiuto sarebbe apprezzato!

+0

solo per la cronaca, il tutorial è dal futuro (opencv3.0), ma sì, è obsoleto. per la versione 3.0, dovresti usare cv2.StereoBM_create() o cv2.StereoSGBM_create(). – berak

+0

sembra esistere cv2.StereoBM, ma utilizzando cv2.StereoBM_create() o cv2.StereoSGBM_create() restituisce un errore (errore attributo). – jwdink

+0

, ovviamente stai usando opencv2.4, non 3.0 – berak

risposta

-1

La fotocamera viene convertita in verticale anziché in orizzontale. Ruota le immagini di 90 gradi, quindi prova. (Dimostralo a se stessi ruotando lo schermo ho appena preso il mio computer portatile e lo ha trasformato sul suo bordo..)

Lei parla di diversi software; forse un tipo di riga principale/colonna-principale tra l'originale e pyOpenCV.

+0

Se sto capendo correttamente il tuo suggerimento, dovrei provare a ruotare le immagini sorgente di 90 gradi e poi eseguire lo stesso codice? Ho appena provato questo ... non produce risultati migliori. Hai fatto funzionare questo? Se sì, potresti pubblicare il risultato? – jwdink

+0

Penso che questa sia solo la formattazione della domanda ... Le immagini provengono da due prospettive separate orizzontalmente. – will

+0

Inoltre, se questo fosse il caso, allora non avrebbe importanza, dovresti solo mettere l'immagine * in basso a sinistra (ruotare il fotogramma di riferimento). Ruotando ognuna delle immagini individualmente si fermerebbe effettivamente il suo funzionamento. – will

1

E 'possibile che è necessario per mantenere la regolazione dei parametri dell'algoritmo blocco corrispondente.

un'occhiata a questo articolo del blog: autore https://erget.wordpress.com/2014/03/13/building-an-interactive-gui-with-opencv/

del articolo è composto da un insieme di classi per rendere il processo di calibrazione delle telecamere più snelle rispetto il tutorial OpenCV. Queste classi sono disponibili come pacchetto PyPI: https://github.com/erget/StereoVision

Spero che questo aiuti :)

15

Sono disponibili le immagini nel modo sbagliato.

Guardate le immagini, lo stagno dietro la lampada permette di lavorare le posizioni telecamere delle due immagini,

basta cambiare questo:

# v 
imgR = cv2.imread('Yeuna9x.png',0) 
imgL = cv2.imread('SuXT483.png',0) 
#^

Se guardate l'immagine nel tutorial che dicono è il frame left, lo stesso del tuo right.

Ecco il mio risultato dopo la modifica.

enter image description here

Problemi correlati