第一步:打开摄像头
void MainWindow::on_OpenCameraBtn_clicked()
{
capture = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
if(capture==NULL)
{
qDebug()<<"error!";
}
timer->start(50);//开始计时,超时则发出timeout()信号,1000为1秒,50毫秒取一帧
}
其中cvCreateCameraCapture()函数中参数表示为摄像头的ID,0表示使用任意一个摄像头,如果电脑有多个摄像头,还需指定ID,返回capture指针,这使得后面可以用从视频流获取帧的办法来处理图像。
第二步:获取图像
frame = cvQueryFrame(capture);//从摄像头中抓取并返回每一帧
// 将抓取到的帧,从IplImage格式转换为QImage格式,rgbSwapped是为了显示效果色彩好一些
//QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar*)frame->imageData,
frame->width, frame->height,
QImage::Format_RGB888).rgbSwapped();
此处获取的图像为Mat类型,但是为了显示效果更好,使用rebSwapped()函数,转换为QImage类型,后边黑白二值化后要转换回Mat类型,因为opencv视觉库是对Mat类型的图像操作,或者此处不用转换,灰度处理和黑白二值化都用opencv中的函数。
第三步:灰度处理
for (int i = 0; i < image.width(); i++)
{
for (int j= 0; j < image.height(); j++)
{
QRgb color = image.pixel(i, j);
int gray = qGray(color);