Visualizzare un flusso webcam in PyQt4 utilizzando OpenCV Camera Capture
Domanda
Sto usando questo script Python per visualizzare la 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":
sys.exit(0)
if __name__ == "__main__":
while True:
repeat()
Si sta lavorando abbastanza bene, ma mi piacerebbe impostare questo display all'interno della mia applicazione Qt.
Come posso utilizzare l'immagine IplImage
OpenCV in una VideoWidget
Qt?
Soluzione
ho usato il codice soffietto per convertire un objet Iplimage ad un QImage. Mi c'è voluto un po 'di tempo per ottenere i formati giusti. Iplimage è un formato a 3 canali con ordine canale BGR mentre QImage utilizza ordine dei canali 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)
Altri suggerimenti
Sembra che abbiamo bisogno di legare questo codice C ++ 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));
}
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;
}
Questo ha funzionato per me. Io lavoro su Linux con 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow