上一篇介绍了如何交叉编绎OpenCv,本篇介绍如何使用OpenCv从USB摄像头预览,拍照和录像。
1、编绎环境
2、准备工作
宿主机:ubuntu12.06 x64 3.5.0-44-generic
交叉编绎器:arm-linux-gcc 4.6.2
目标平台:FreeScale I.MAX6 4核1.2G
USB摄像头一个
qt4.5 交叉编绎
3、源码解析
这里只讲解关键代码,后面会提供源码下载链接,请大家自行研究。
使用线程读取摄像头数据,并写文件,然后发送信号到widget做图片显示。
/*
* CameraThread.cpp
*
* Created on: 2012-12-11
* Author: root
*/
#include "CameraThread.h"
#include <stdio.h>
#include <iostream>
using namespace std;
CameraThread::CameraThread() {
// TODO Auto-generated constructor stub
fps = 6; //捕捉帧率
cam = NULL;
bStop = true;
}
CameraThread::~CameraThread() {
// TODO Auto-generated destructor stub
}
/******************************
********* 打开摄像头 ***********
*******************************/
void CameraThread::openCamara() {
cam = cvCreateCameraCapture(2,480,320);//打开摄像头,从摄像头中获取视频流
if(cam) {
frame = cvQueryFrame(cam);
writer = cvCreateVideoWriter("opencv.avi", CV_FOURCC('X', 'V', 'I', 'D'),
fps, cvSize(frame->width, frame->height));
bStop = false;
}
else {
cout << "could not open camera." <<endl;
bStop = true;
}
}
/*********************************
********* 读取摄像头信息 ***********
**********************************/
void CameraThread::readFarme() {
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
cvWriteFrame(writer, frame);//录像,其中writer为上面创建的视频文件,frame为视频帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
image = QImage((const uchar*) frame->imageData, frame->width,
frame->height, QImage::Format_RGB888).rgbSwapped();
emit showImage(image);
}
void CameraThread::takePictures(){
if(cam){
// 从摄像头中抓取并返回每一帧
frame = cvQueryFrame(cam);
//保存一帧
cvSaveImage("camera.jpg", frame);
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar*) frame->imageData, frame->width,
frame->height, QImage::Format_RGB888).rgbSwapped();
stop();
emit showImage(image);
} else {
printf("have not open the camera!\n");
}
}
void CameraThread::stop()
{
bStop = true;
}
void CameraThread::run()
{
openCamara();
while (!bStop)
{
readFarme();
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&cam);//释放内存;
}
widget显示图像代码
void opencvCamera::showImage(QImage image){
ui.label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
ui.label->setFixedSize(camera->frame->width, camera->frame->height);
}
4、运行效果
编译该Qt程序,放到E9板子linux文件系统下。执行该程序:./opencvCamera -qws效果如下:
5、常见错误
执行报错:
- 缺少相关库
- /lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
这时就将交叉编译器中/opt/EmbedSky/toolchains/gcc-4.6.2/tq-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/usr/lib/ 下libstdc++.so开头的几个头文件复制到E9板子/lib 目录下即可。
- 程序不可执行