Python / OpenCV: преобразование изображений, полученных из захвата - PullRequest
3 голосов
/ 27 ноября 2009

Я пытаюсь преобразовать изображения, снятые с захвата (веб-камера), и обработать их с помощью OpenCV, но мне трудно ...

При попытке преобразовать изображение в оттенки серого программа вылетает. (Python.exe перестал работать)

Вот основной фрагмент моего кода:

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)

Когда я пытаюсь использовать cvConvertScale, я получаю ошибку подтверждения:

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

, что имеет смысл, но я довольно озадачен тем, как конвертировать входные изображения моей веб-камеры в изображения, которые могут использоваться такими функциями, как cvUpdateMotionHistory () и cvCalcOpticalFlowLK ()

Есть идеи? Спасибо.

UPDATE:

Я преобразовал изображение в оттенки серого вручную с помощью:

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

Но это занимает довольно много времени ... и я до сих пор не могу понять, почему cvCvtColor вызывает сбой программы.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2009

По какой-то причине CvtColor вызвал сбой программы, когда глубина изображения достигла 8 бит. Когда я конвертировал их в 32 бит, программа больше не зависала и казалось, что все работает нормально. Я понятия не имею, почему это так, но, по крайней мере, сейчас это работает.

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)
1 голос
/ 27 ноября 2009

Здесь распространена ошибка:

Вы создаете одно изображение в переменной newFrameImageGS перед циклом, затем перезаписываете его содержимое в цикле, которое затем добавляется в список. Результат не будет тем, что вы ожидаете. Список будет содержать пять ссылок на один и тот же экземпляр изображения в конце, поскольку в список добавляется только ссылка на объект, и копия объекта, созданная таким образом, не создается. Это изображение будет содержать самый последний кадр, так что в результате вы получите пять из этого кадра, я думаю, это не то, что вам нужно. Пожалуйста, просмотрите руководство по Python, если оно вам не понятно. Вы можете решить эту проблему, переместив первую строку приведенного выше кода в тело цикла for.

Другие возможности, если исправить вышеперечисленное, вам не помогут:

Функция CvtColor кажется правильной для преобразования в оттенки серого, поскольку она может преобразовывать в другое количество каналов.

Согласно этому руководству функция CvtColor требует целевого изображения того же типа данных, что и источник. Пожалуйста, проверьте, что newFrameImage является IPL_DEPTH_8U изображением.

...