Python/OpenCV:Преобразование изображений, взятых из capture
Вопрос
Я пытаюсь конвертировать изображения, сделанные с камеры захвата (webcam), и выполнить некоторую обработку с помощью 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 ()
Есть какие-нибудь идеи?Спасибо.
Обновить:
Я преобразовал изображение в оттенки серого вручную с помощью этого:
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 вызывает сбой программы.
Решение
По какой-то причине 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)
Другие советы
Здесь налицо распространенная ошибка:
Вы создаете единое изображение в newFrameImageGS
переменная до того, как цикл, затем перезаписывает его содержимое в цикле, которое затем добавляется к списку.Результат будет совсем не таким, как вы ожидали.Список будет содержать пять ссылок на один и тот же экземпляр изображения в конце, поскольку к списку добавляется только ссылка на объект, копия объекта, созданная таким образом, отсутствует.Это изображение будет содержать самый последний кадр, так что в результате вы получите пять таких кадров, а это, я думаю, не то, что вы хотите.Пожалуйста, ознакомьтесь с руководством по Python, если оно вам непонятно.Вы можете решить эту проблему, переместив первую строку приведенного выше кода в тело цикла for.
Другие возможности, если исправление вышеизложенного вам не поможет:
Тот самый CvtColor
функция кажется правильной для преобразования в оттенки серого, поскольку она может преобразовываться в другое количество каналов.
Согласно это руководство тот самый CvtColor
для функции требуется целевое изображение того же типа данных, что и исходное.Пожалуйста, дважды проверьте это newFrameImage
является IPL_DEPTH_8U
изображение.