Estoy tratando de convertir las imágenes tomadas desde la captura de video (webcam) y hacer algún tipo de procesamiento en ellos con OpenCV, pero estoy teniendo un tiempo difícil..

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

Aquí está el principal fragmento 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 trato de usar cvConvertScale me sale el error de aserción:

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

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

Alguna idea? Gracias.

ACTUALIZACIÓN:

Me convierte 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 toma bastante tiempo.. y yo todavía no puedo entender por qué cvCvtColor está causando el programa de choque.

InformationsquelleAutor Domenic | 2009-11-27

2 Comentarios

  1. 4

    Por alguna razón, CvtColor hizo que el programa se bloquee cuando la imagen profundidades donde los 8 bits. Cuando yo me convertí a 32 bits, el programa ya no se estrelló y todo parecía funcionar bien. No tengo idea de por qué es, 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)
    • Gracias Domenic (lol mismo nombre). Me topé con esto después de encontrar este error y pasar horas tratando de solucionarlo.
    • se bloquea debido a que estaba escribiendo una matriz de 4 tipos más grande (1 float = 4 bytes. es decir. A LOS 32 ° F = 4 * 8U)
  2. 1

    Hay un error común aquí:

    Va a crear una imagen única en la newFrameImageGS variable antes de el bucle, a continuación sobreescribir su contenido en el bucle, que es agregado a una lista. El resultado no será lo que usted esperaría. La lista contendrá cinco referencias a la misma instancia de imagen en el final, ya que sólo la referencia de objeto se añade a la lista, que no hay ninguna copia del objeto que se hizo de esta manera. Esta imagen contiene el último fotograma, por lo que usted consigue cinco de ese cuadro como un resultado, que no es lo que quiere, supongo. Por favor, revise el tutorial de Python si no está claro para usted. Usted puede resolver este por el movimiento de la primera línea del código en el cuerpo del bucle for.

    Otra de las posibilidades si la fijación de los de arriba no te ayuda:

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

    Según este manual la CvtColor función requiere una imagen de destino del mismo tipo de datos como fuente. Por favor, compruebe que newFrameImage es un IPL_DEPTH_8U imagen.

    • Ok. Yo traté de mover esa declaración dentro del bucle, y el programa se bloquea. También comprobé la profundidad de newFrameImage, y es 8, por lo que debe ser correcto también.

Dejar respuesta

Please enter your comment!
Please enter your name here