Pergunta

Eu estou tentando imagens converter tomadas a partir de uma captura (webcam) e fazer algum processamento sobre eles com OpenCV, mas estou tendo um momento difícil ..

Ao tentar converter a imagem em tons de cinza, o programa trava. (Trabalho python.exe parou)

Aqui é o principal trecho do meu 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)

Quando tento usar cvConvertScale eu recebo o erro de declaração:

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

o que faz sentido, mas estou muito confuso sobre como proceder para converter as imagens de entrada da minha web cam em imagens que podem ser usados ??por funções como cvUpdateMotionHistory () e cvCalcOpticalFlowLK ()

Todas as idéias? Obrigado.

UPDATE:

Eu converti a imagem em tons de cinza manualmente com esta:

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

Mas isso leva muito tempo .. e eu ainda não consigo descobrir por que cvCvtColor está causando o programa deixe de funcionar.

Foi útil?

Solução

Por alguma razão, CvtColor causou o programa falha quando as profundezas imagem onde 8 bits. Quando me converti-los para 32 bit, o programa não caiu e tudo parecia trabalho OK. Eu não tenho idéia por que isso é, mas pelo menos ele funciona agora.

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)

Outras dicas

Há um erro comum aqui:

Você está criando uma única imagem na variável newFrameImageGS antes o loop, em seguida, substituir o seu conteúdo no circuito, que é então anexado a uma lista. O resultado não será o que você esperaria. A lista contem cinco referências para a mesma imagem exemplo, no final, uma vez que apenas o objecto de referência é acrescentada à lista, nenhuma cópia do objecto fabricado desta maneira. Esta imagem conterá o último quadro, de modo a obter cinco de esse quadro, como resultado, o que não é o que você quer é, eu acho. Por favor, revise o tutorial Python se não está claro para você. Você pode resolver isso movendo a primeira linha do código acima no corpo do loop for.

Outra possibilidades se fixar o acima não iria ajudá-lo:

A função CvtColor parece ser o correto para a conversão em escala de cinza, uma vez que pode converter para um número diferente de canais.

De acordo com a este o manual da função CvtColor requer um imagem de destino do mesmo tipo de dados como a fonte. Por favor verifique que newFrameImage é uma imagem de IPL_DEPTH_8U.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top