Display a webcam stream in PyQt4 using OpenCV Camera Capture


I am using this Python script to display my webcam:

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":

if __name__ == "__main__":
    while True:

It is working quite well, but I would like to set this display inside my Qt application. How can I use the IplImage OpenCV image into a Qt VideoWidget?

2/10/2017 12:24:10 AM

Accepted Answer

I used the code bellow to covert a Iplimage objet to a QImage. It took me some time to get the right formats. Iplimage is a 3-channel format with BGR channel order while QImage uses RGB channel order.

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)
4/7/2012 9:16:59 AM

It looks like we need to bind this C++ code in 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));
                                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;

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow