Pregunta

Estoy intentando convertir las imágenes tomadas de una captura (cámara web) y procesarlas con OpenCV, pero estoy pasando por un momento difícil ...

Al intentar convertir la imagen a escala de grises, el programa se bloquea. (Python.exe ha dejado de funcionar)

Aquí está el fragmento principal de mi código:

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)

Cuando intento usar cvConvertScale obtengo el error de aserción:

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

lo cual tiene sentido, pero estoy bastante confundido sobre cómo convertir las imágenes de entrada de mi cámara web en imágenes que pueden ser utilizadas por funciones como cvUpdateMotionHistory () y cvCalcOpticalFlowLK ()

¿Alguna idea? Gracias.

ACTUALIZAR:

Convertí la imagen a escala de grises manualmente con esto:

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

Pero esto lleva bastante tiempo ... y todavía no puedo entender por qué cvCvtColor está causando que el programa se bloquee.

¿Fue útil?

Solución

Por alguna razón, CvtColor provocó que el programa se bloquee cuando la imagen tenía una profundidad de 8 bits. Cuando los convertí a 32 bits, el programa ya no se bloqueaba y todo parecía funcionar bien. No tengo idea de por qué esto es así, pero al menos funciona ahora.

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)

Otros consejos

Hay un error común aquí:

Está creando una sola imagen en la variable newFrameImageGS antes del bucle, luego sobrescriba su contenido en el bucle, que luego se adjunta a una lista. El resultado no será el esperado. La lista contendrá cinco referencias a la misma instancia de imagen al final, ya que solo la referencia del objeto se adjunta a la lista, sin copia del objeto realizado de esta manera. Esta imagen contendrá el último fotograma, por lo que obtienes cinco de ese fotograma como resultado, que no es lo que quieres, supongo. Por favor revise el tutorial de Python si no está claro para usted. Puede resolver esto moviendo la primera línea del código anterior al cuerpo del bucle for.

Otras posibilidades si arreglar lo anterior no te ayudaría:

La función CvtColor parece ser la correcta para la conversión a escala de grises, ya que se puede convertir a un número diferente de canales.

Según este manual el CvtColor La función requiere una imagen de destino del mismo tipo de datos que la fuente. Comprueba que newFrameImage sea una imagen de IPL_DEPTH_8U .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top