عرض دفق كاميرا ويب في PYQT4 باستخدام التقاط كاميرا OpenCV

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

سؤال

أنا أستخدم هذا البرنامج النصي Python لعرض كاميرا الويب الخاصة بي:

from opencv.cv import *  
from opencv.highgui import *  

import sys

cvNamedWindow("w1", CV_WINDOW_AUTOSIZE)
camera_index = 0
capture = cvCreateCameraCapture(camera_index)

def repeat():
    global capture #declare as globals since we are assigning to them now
    global camera_index
    frame = cvQueryFrame(capture)
    cvShowImage("w1", frame)
    c = cvWaitKey(10)

    if c == "q":
        sys.exit(0)

if __name__ == "__main__":
    while True:
        repeat()

إنه يعمل بشكل جيد ، لكنني أود تعيين هذا العرض داخل تطبيق QT الخاص بي. كيف يمكنني استخدام IplImage صورة OpenCV في QT VideoWidget?

هل كانت مفيدة؟

المحلول

لقد استخدمت الرمز المرفق لتغطية Objet iplimage إلى Qimage. استغرق الأمر مني بعض الوقت للحصول على التنسيقات الصحيحة. iPlimage عبارة عن تنسيق من 3 قنوات مع ترتيب قناة BGR بينما يستخدم Qimage ترتيب قناة RGB.

camcapture = cv.CaptureFromCAM(0)       
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_WIDTH, 1280)
cv.SetCaptureProperty(camcapture,cv.CV_CAP_PROP_FRAME_HEIGHT, 720);

frame = cv.QueryFrame(camcapture)
image = QImage(frame.tostring(), frame.width, frame.height, QImage.Format_RGB888).rgbSwapped()
pixmap = QPixmap.fromImage(image)

نصائح أخرى

يبدو أننا بحاجة إلى ربط رمز C ++ هذا في Python:

QImage& cvxCopyIplImage(const IplImage *pIplImage, QImage &qImage)
{
        if(!CV_IS_IMAGE(pIplImage)) return qImage;

        int w = pIplImage->width;
        int h = pIplImage->height;


        if(qImage.width() != w || qImage.height() != h)
        {
                qImage = QImage(w, h, QImage::Format_RGB32);
        }

        int x, y;
        for(x = 0; x < pIplImage->width; ++x)
        {
                for(y = 0; y < pIplImage->height; ++y)
                {
                        CvScalar color = cvGet2D(pIplImage, y, x);

                        if(pIplImage->nChannels == 1)
                        {
                                int v = color.val[0];

                                qImage.setPixel(x, y, qRgb(v,v,v));
                        }
                        else
                        {
                                int r = color.val[2];
                                int g = color.val[1];
                                int b = color.val[0];

                                qImage.setPixel(x, y, qRgb(r,g,b));
                        }
                }
        }

        if(pIplImage->origin != IPL_ORIGIN_TL)
        {
                qImage = qImage.mirrored(false, true);
        }

        return qImage;
}

هذا واحد عمل بالنسبة لي. أنا أعمل على Linux مع Python 2.6.5:

import base64
import Image
import time
import urllib2
import cv

# Basic HTTP Authentication...
url = 'http://192.168.0.11:82/Videostream.cgi'
ww = 'Username:Password'
encodedstring = base64.encodestring(ww)[:-1]
auth = "Basic %s" % encodedstring
req = urllib2.Request(url,None, {"Authorization": auth })
handle = urllib2.urlopen(req)

def read_stream():
    buf = ''
    b = handle.readlines(45)
    for a in b:
        if a.startswith('Content-Length'):
            readlen = str(a).split()[1]
    b1 = handle.read(int(readlen)+4)
    return b1

def test():
    pass

def write_stream():
    imgc = read_stream()
    cv_img = cv.CreateImageHeader((640,480), cv.IPL_DEPTH_8U, 3)
    buf = Image.fromstring('RGB',(640,480),imgc[2:], 'jpeg', 'RGB', None)
    cv.SetData(cv_img, buf.tostring(), (640*3))
    return cv_img


fps = 10.0

if __name__ == "__main__":
    while True:
        frame = write_stream()
        cv.ShowImage('Camera', frame)
        k = cv.WaitKey(10)
        time.sleep(int(1.0/fps))
        if k == 0x10001b: # ESC
            cv.DestroyWindow("Camera")
            print 'ESC pressed. Exiting ...'
            break
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top