交叉编绎OpenCv之预览,拍照和录像

来源:互联网 发布:finalcaption字幕软件 编辑:程序博客网 时间:2024/04/28 17:52

上一篇介绍了如何交叉编绎OpenCv,本篇介绍如何使用OpenCv从USB摄像头预览,拍照和录像。


1、编绎环境

宿主机:ubuntu12.06 x64 3.5.0-44-generic
交叉编绎器:arm-linux-gcc 4.6.2

目标平台:FreeScale I.MAX6 4核1.2G

2、准备工作
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 stubfps = 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、常见错误

       执行报错:
  • 缺少相关库
  这时只需要将缺少的库一个一个复制到E9板子linux文件系统的/opt/PDA/lib/  目录下即可。
  • /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 目录下即可。
  • 程序不可执行
  这种情况就很可能是因为Qt程序没有交叉编译为arm版本,需检查编译出来的是PC版程序还是arm版的程序。


源码下载:http://download.csdn.net/detail/lkppostt/6928721

0 0