- void Widget: :paintEvent(QPaintEvent * ) {
- uchar * pImgBuf;
- unsigned int len;
- camReturn = m_camera - >get_frame((void * *) & pImgBuf, &len);
- convert_yuv_to_rgb_buffer(pImgBuf, imgBuf, image_width, image_height);
- frame - >loadFromData((uchar * ) imgBuf,
- /*len*/
- image_width * image_height * 3 * sizeof(char));
- IplImage * src = QImageToIplImage(frame);
- if (!src) {
- printf("img error!");
- return;
- }
- //更改图像大小(后期对人脸检测时间控制会有很大帮助)
- double sizeScale = imgSizeScaleSmall;
- CvSize img_cvsize;
- img_cvsize.width = src - >width * sizeScale;
- img_cvsize.height = src - >height * sizeScale;
- IplImage * dst = cvCreateImage(img_cvsize, src - >depth, src - >nChannels);
- cvResize(src, dst, CV_INTER_LINEAR); //opencv函数更改图片大小
- // cvSaveImage("jason.jpg", src); //ARM对opencv的highgui支持极其差,这个函数不能使用
- //更改图像大小,清晰度会下降
- sizeScale = imgSizeScaleBig;
- img_cvsize.width = dst - >width * sizeScale;
- img_cvsize.height = dst - >height * sizeScale;
- IplImage * img = cvCreateImage(img_cvsize, dst - >depth, dst - >nChannels);
- cvResize(dst, img, CV_INTER_LINEAR);
- QImage qimage = QImage((uchar * ) img - >imageData, img - >width, img - >height, image_Format);
- //IplImage为BGR格式,QImage为RGB格式,所以要交换B和R通道显示才正常
- //可以用OpenCV的cvConcertImage函数交换,也可以用QImage的rgbSwapped函数交换;
- qimage = qimage.rgbSwapped();
- ui - >m_imgLabel - >setPixmap(QPixmap: :fromImage(qimage));
- camReturn = m_camera - >unget_frame();
- cvReleaseImage( & img); //释放图片内存
- cvReleaseImage( & src);
- }
来源: http://lib.csdn.net/snippet/opencv/49974