из строки байтов в IplImage OpenCV в Python? - PullRequest
3 голосов
/ 04 июня 2010

Я передаю некоторые данные с веб-камеры. Когда я получаю все байты для полного изображения (в строке с именем byteString), я хочу отобразить изображение с помощью OpenCV. Сделано достаточно быстро, это позволит «транслировать» видео с веб-камеры в окно OpenCV.

Вот что я сделал, чтобы настроить окно:

cvNamedWindow('name of window', CV_WINDOW_AUTOSIZE)

А вот что я делаю, когда завершена строка байтов:

img = cvCreateImage (IMG_SIZE, PIXEL_DEPTH, CHANNELS)
buf = ctypes.create_string_buffer (byteString) img.imageData = ctypes.cast (buf, ctypes.POINTER (ctypes.c_byte)) cvShowImage ('имя окна', img) cvWaitKey (0)

По какой-то причине это вызывает ошибку:

Файл "C: \ Python26 \ lib \ site-packages \ ctypes_opencv \ highgui_win32.py", строка 226, в исполнении return func (* args, ** kwargs)

WindowsError: exception: access violation reading 0x015399E8

Кто-нибудь знает, как сделать то, что я пытаюсь сделать / как исправить эту сумасшедшую ошибку нарушения?

Ответы [ 2 ]

2 голосов
/ 05 июня 2010

Я действительно решил эту проблему и забыл опубликовать решение. Вот как я это сделал, хотя он может быть не совсем устойчивым:

Я проанализировал заголовки, исходящие от MJPEG сетевой камеры, для которой я делал это, затем я просто считал из потока 1 байт за раз, и, когда я обнаружил, что заголовок следующего изображения также находился в bytestring, я обрезал последние 42 байта (так как это длина заголовка).

Затем у меня были байты JPEG, поэтому я просто создал новое Cv-изображение, используя метод open (...) и передав ему байтовую строку, обернутую в класс StringIO.

0 голосов
/ 04 июня 2010

Тайлер:

Я не уверен, что вы пытаетесь сделать ... У меня есть несколько догадок.

если вы пытаетесь просто прочитать изображение с веб-камеры, подключенной к вашему компьютеру, тогда этот код должен работать:

import cv

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    if cv.WaitKey(10) == 27:
        break

вы пытаетесь транслировать видео с интернет-камеры?если это так, вы должны проверить этот другой пост: opencv-with-network-camera

Если по какой-то причине вы не можете сделать это каким-либо из этих способов, то, возможно, вы можете просто как-то сохранитьизображение на жестком диске, а затем загрузите его в вашу программу opencv, выполнив простой cvLoadImage (конечно, этот способ намного медленнее).

другой подход - установить пиксели нового изображения вручную, прочитав каждое из значений из byteString, выполнив что-то вроде этого:

for(int x=0;x<640;x++){
                for(int y=0;y<480;y++){
                        uchar * pixelxy=&((uchar*) (img->imageData+img->widthStep*y))[x];
                        *pixelxy=buf[y*img->widthStep + x]; 
                }
        }

это также медленнее, но быстрее, чем использованиежесткий дискВ любом случае, надеюсь, что это поможет, вам следует также указать, какую версию opencv вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...