Python/OpenCV:Преобразование изображений, взятых из capture

StackOverflow https://stackoverflow.com/questions/1807528

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь конвертировать изображения, сделанные с камеры захвата (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 изображение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top