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

上一篇介绍了如何交叉编绎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 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、常见错误

       执行报错:
  • 缺少相关库
  这时只需要将缺少的库一个一个复制到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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值