Domanda

Sto cercando di convertire le immagini prese da una cattura (webcam) e di elaborarle con OpenCV, ma sto attraversando un momento difficile ..

Quando si tenta di convertire l'immagine in scala di grigi, il programma si arresta in modo anomalo. (Python.exe ha smesso di funzionare)

Ecco il frammento principale del mio codice:

newFrameImageGS = cv.CreateImage ((320, 240), cv.IPL_DEPTH_8U, 1)

for i in range(0,5):
    newFrameImage = cv.QueryFrame(ps3eye)
    cv.CvtColor(newFrameImage,newFrameImageGS,cv.CV_BGR2GRAY)
    golfSwing.append(newFrameImageGS)

Quando provo ad usare cvConvertScale ottengo l'errore di asserzione:

src.size() == dst.size() && src.channels() == dst.channels()

il che ha senso, ma sono piuttosto confuso su come convertire le immagini di input della mia webcam in immagini che possono essere utilizzate da funzioni come cvUpdateMotionHistory () e cvCalcOpticalFlowLK ()

Qualche idea? Grazie.

UPDATE:

Ho convertito l'immagine in scala di grigi manualmente con questo:

for row in range(0,newFrameImage.height):
            for col in range(0,newFrameImage.width):
                newFrameImageGS[row,col] = (newFrameImage8U[row,col][0] * 0.114 + # B
                                            newFrameImage8U[row,col][1] * 0.587 + # G
                                            newFrameImage8U[row,col][2] * 0.299)  # R

Ma ci vuole un po 'di tempo .. e ancora non riesco a capire perché cvCvtColor stia causando l'arresto anomalo del programma.

È stato utile?

Soluzione

Per qualche motivo, CvtColor ha causato l'arresto anomalo del programma quando l'immagine ha raggiunto la profondità di 8 bit. Quando li ho convertiti in 32 bit, il programma non si è bloccato più e tutto sembrava funzionare correttamente. Non ho idea del perché, ma almeno ora funziona.

newFrameImage = cv.QueryFrame(ps3eye)

newFrameImage32F = cv.CreateImage((320, 240), cv.IPL_DEPTH_32F, 3)
cv.ConvertScale(newFrameImage,newFrameImage32F)

newFrameImageGS_32F = cv.CreateImage ((320,240), cv.IPL_DEPTH_32F, 1)
cv.CvtColor(newFrameImage32F,newFrameImageGS_32F,cv.CV_RGB2GRAY)

newFrameImageGS = cv.CreateImage ((320,240), cv.IPL_DEPTH_8U, 1)
cv.ConvertScale(newFrameImageGS_32F,newFrameImageGS)

Altri suggerimenti

C'è un errore comune qui:

Stai creando una singola immagine nella variabile newFrameImageGS prima del ciclo, quindi sovrascrivi il suo contenuto nel ciclo, che viene quindi aggiunto a un elenco. Il risultato non sarà quello che ti aspetteresti. L'elenco conterrà cinque riferimenti alla stessa istanza dell'immagine alla fine, poiché solo il riferimento all'oggetto viene aggiunto all'elenco, nessuna copia dell'oggetto viene eseguita in questo modo. Questa immagine conterrà l'ultimo fotogramma, quindi ne otterrai cinque, quindi non è quello che vuoi, immagino. Esamina il tutorial di Python se non è chiaro per te. Puoi risolverlo spostando la prima riga del codice sopra nel corpo del ciclo for.

Un'altra possibilità se risolvere quanto sopra non ti sarebbe di aiuto:

La funzione CvtColor sembra essere quella corretta per la conversione in scala di grigi, poiché può essere convertita in un numero diverso di canali.

Secondo questo manuale il CvtColor richiede un'immagine di destinazione dello stesso tipo di dati della sorgente. Verifica che newFrameImage sia un'immagine IPL_DEPTH_8U .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top