本人刚开始使用opencv处理图像,好不容易将opencv和qt环境搭建好,就小试牛刀,结果打开笔记本摄像头后,显示的全是黑色的画面,不管是用cvCaptureFromCAM、VideoCapture或者是使用cvCreateCameraCapture来打开摄像头,结果都不行。但是又能够将本地的图片压缩成avi视频,并且播放。下面是我的代码和截图,求大神的指教啊:
//声明IplImage指针
IplImage* pFrame = NULL;
//获取摄像头
CvCapture* pCapture = cvCaptureFromCAM(0);// cvCreateCameraCapture(0);
cvWaitKey(200);
//创建窗口
cvNamedWindow("Video", 1);
//显示视屏
while (1){
pFrame = cvQueryFrame(pCapture);
if (!pFrame)break;
cvShowImage("Video", pFrame);
int c = cvWaitKey(33);
if (c == 27)break;
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("Video");
或者是:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
widget::widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::widget)
{
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
imag = new QImage(); // 初始化
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));
connect(ui->pic, SIGNAL(clicked()), this, SLOT(takingPictures()));
connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));
}
/******************************
********* 打开摄像头 ***********
*******************************/
void widget::openCamara()
{
cam = cvCreateCameraCapture(0); //打开摄像头,从摄像头中获取视频
// cam = VideoCapture(0); //打开摄像头,从摄像头中获取视频
timer->start(200); // 开始计时,超时则发出timeout()信号
}
/*********************************
********* 读取摄像头信息 ***********
**********************************/
void widget::readFarme()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
qDebug()<<"frame"<<frame;
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
qDebug()<<"image"<<image;
ui->label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}
/*************************
********* 拍照 ***********
**************************/
void widget::takingPictures()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
ui->label_2->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}
/*******************************
***关闭摄像头,释放资源,必须释放***
********************************/
void widget::closeCamara()
{
timer->stop(); // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
}
widget::~widget()
{
delete ui;
}