上一篇中运行了一个简单的例子,但是并没有调用摄像头进行图像采集,看了几篇博客也都是对静态图像的基本处理操作。
http://www.cnblogs.com/Romi/archive/2012/03/14/2396533.html(主要时QT控件操作)
http://www.cnblogs.com/emouse/archive/2013/03/31/2991333.html(OpenCV的初步图像处理)
由于我的直接目标不是这个,就没有完全操作一遍。直接找OpenCV摄像头操作。
首先熟悉了一下摄像头相关内容:
摄像头的数据输出格式一般分为CCIR601、CCIR656、RAW RGB等格式,此处说的RGB格式应该就是CCIR601或CCIR656格式。而RAW RGB格式与一般的RGB格式是有区别的。
我们知道,Sensor的感光原理是通过一个一个的感光点对光进行采样和量化,但,在Sensor中,每一个感光点只能感光RGB中的一种颜色。所以,通常所说的30万像素或130万像素等,指的是有30万或130万个感光点。每一个感光点只能感光一种颜色。
但 是,要还原一个真正图像,需要每一个点都有RGB三种颜色,所以,对于CCIR601或656的格式,在Sensor模组的内部会有一个ISP模块,会将 Sensor采集到的数据进行插值和特效处理,例如:如果一个感光点感应的颜色是R,那么,ISP模块就会根据这个感光点周围的G、B感光点的数值来计算 出此点的G、B值,那么,这一点的RGB值就被还原了,然后在编码成601或656的格式传送给Host。
而RAW RGB格式的Sensor则是将每个感光点感应到的RGB数值直接传送给Host,由Host来进行插值和特效处理。
Raw RGB 每个像素只有一种颜色(R、G、B中的一种);
RGB 每个像素都有三种颜色,每一个的值在0~255之间;
在 手机摄像头的测试过程中,由sensor输出的数据就是Raw data(Raw RGB),经过彩色插值就变成RGB;
sensor输出的数据格式,主要分两种:YUV(比较流行),RGB,这就是sonsor的数据输出;这其中的GRB就是Raw RGB,是sensor的bayer阵列获取的数据(每种传感器获得对应的颜色亮度);
但是输出的数据不等于就是图像的实际数据,模组测试时,就要写一个软件,完成数据采集(获得Raw data)->彩色插值(目的是获得RGB格式,便于图像显示)->图像显示;
这样就可以发现整个模组是否正常,有无坏点,脏点的等,检测出不良品;(软件的处理过程当中,为了获得更好的图像质量,还需要白平衡,gamma校正,彩色校正)
而在手机的应用中,手机根据相机模组的数据格式,提供一个ISP(主要用于RGB格式的),配合软件,使照相功能得到应用;
其实可以了解到opencv只是一个图像处理的工具库,并不是视频处理的工具库!也就是说,它所处理的对象,应该是一张一张的图片,而opencv本身虽然有一些API 函数可以进行USB相机的读取,但也仅仅是调用了windows 底层的vfw模块来实现,所以,如果你是windows vista,windows7之类的操作系统,很可能微软已经抛弃了vfw模块。而这个时候,再利用opencv的相机视频捕获函数,就无法获取视频帧 了。
同样linux下面也是这样,他需要调用底层的v4l库来实现调用摄像头。刚开始没有注意到这个问题,直接写程序来操作摄像头,结果一直出不来图像,报错。
#include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); timer = new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(slot_timer())); timer->start(FPS); img = new QImage; frame = NULL; //capture = cvCreateCameraCapture(0); //cvNamedWindow("jdh",CV_WINDOW_AUTOSIZE); } void Widget::slot_timer() { capture = cvCreateCameraCapture(0); if(capture==NULL){ qDebug()<<"error!"; } frame = cvQueryFrame(capture); if (!frame) { return; } //img->load("test.jpg"); cvCvtColor(frame,frame,CV_BGR2RGB); img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,frame->widthStep,QImage::Format_RGB888); //img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,QImage::Format_RGB888); update(); //cvShowImage("jdh",frame); } void Widget::paintEvent(QPaintEvent * event) { //painter->drawImage(0,0,mm); QPainter *pp = new QPainter(this); pp->drawImage(0,0,*img,0,0,-1,-1,0); } Widget::~Widget() { delete ui; cvReleaseImage(&frame); //cvDestroyWindow("jdh"); }
其中:capture = cvCreateCameraCapture(0);这一据执行时,终端就报错:error!
所以我又回过头去把OpenCV重新编译,把与摄像头有关的底层库都添加进来。
光这一步,我整整花了一天时间都没搞定啊。
晚上22时55分37秒,恍然大悟,网上的程序都是PC上用的,不是用在Zedboard上的,capture = cvCreateCameraCapture(0);这个方法根本不是用在板子上的,板子根本不认识这个函数。而且Zedboard板子跑的不是linux桌面系统。
要知道这些与摄像头相关的库都属于第三方库,所以还需要进行移植。于是开始了第二天的撞墙。
重新下载源码,进行OpenCV的编译,下了3个,2.3.1,2.4.2,2.4.5,
按照步骤来:在源码路径创建toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++)
交叉编译路径可以用绝对路径。
然后cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .(.代表当前目录)
-- Detected version of GNU GCC: 46 (406) -- Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.3.4") -- Could NOT find PythonLibs (missing: PYTHON_INCLUDE_DIRS) (Required is at least version "2.7.3") -- Could NOT find OPENCL (missing: OPENCL_LIBRARY OPENCL_INCLUDE_DIR) -- -- General configuration for OpenCV 2.4.5 ===================================== -- Version control: unknown -- -- Platform: -- Host: Linux 3.2.0-29-generic-pae i686 -- Target: Linux arm -- CMake: 2.8.7 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: Release -- -- C/C++: -- Built as dynamic libs?: YES -- C++ Compiler: /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++ (ver 4.6.1) -- C++ flags (Release): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG -- C++ flags (Debug): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3 -- C Compiler: /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc -- C flags (Release): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG -- C flags (Debug): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3 -- Linker flags (Release): -- Linker flags (Debug): -- Precompiled headers: YES -- -- OpenCV modules: -- To be built: core imgproc flann highgui features2d calib3d ml video objdetect contrib photo legacy gpu nonfree stitching superres ts videostab -- Disabled: world -- Disabled by dependency: - -- Unavailable: androidcamera java ocl python -- -- GUI: -- QT 4.x: NO -- GTK+ 2.x: NO -- GThread : NO -- GtkGlExt: NO -- OpenGL support: NO -- -- Media I/O: -- ZLib: zlib (ver 1.2.7) -- JPEG: NO -- PNG: NO -- TIFF: NO -- JPEG 2000: NO -- OpenEXR: NO -- -- Video I/O: -- DC1394 1.x: NO -- DC1394 2.x: NO -- FFMPEG: NO -- codec: NO -- format: NO -- util: NO -- swscale: NO -- gentoo-style: NO -- GStreamer: NO -- OpenNI: NO -- OpenNI PrimeSensor Modules: NO -- PvAPI: NO -- GigEVisionSDK: NO -- UniCap: NO -- UniCap ucil: NO -- V4L/V4L2: NO/NO -- XIMEA: NO -- Xine: NO -- -- Other third-party libraries: -- Use IPP: NO -- Use Eigen: NO -- Use TBB: NO -- Use OpenMP: NO -- Use GCD NO -- Use Concurrency NO -- Use C=: NO -- Use Cuda: NO -- Use OpenCL: NO -- -- Python: -- Interpreter: /usr/bin/python (ver 2.7.3) -- -- Java: -- ant: NO -- JNI: NO -- Java tests: YES -- -- Documentation: -- Build Documentation: NO -- Sphinx: NO -- PdfLaTeX compiler: NO -- -- Tests and samples: -- Tests: YES -- Performance tests: YES -- C/C++ Examples: NO -- -- Install path: /home/jiong/OpenCV-build -- -- cvconfig.h is in: /home/jiong/opencv-2.4.5 -- ----------------------------------------------------------------- -- CMake Warning at CMakeLists.txt:866 (message): The source directory is the same as binary directory. "make clean" may damage the source tree -- Configuring done -- Generating done -- Build files have been written to: /home/jiong/opencv-2.4.5
可以看到video I/O全都时NO。其实一开时并不是,都是这些第三方库用不了,全部关了的原因。接下来 ccmake .
CMKAE_INSTALL_PREFIX修改安装路径,可以修改第三方库是否打开。试着打开了,都是编译不通过。不知道怎么来交叉编译这些第三方库。
没办法,实在撞墙太久了,受不了了。只好改变思路了:
所以我决定用v4l和v4l2来进行摄像头操作,使用OpenCV进行图像处理。饶了一大圈,又回来了。
不知道以后还不会不会这样,不过也记录下来吧。这中间n多的错误都是库或者头文件找不到,想想也就是这样的。
要是有人看到我的这篇痛苦经历,有什么好方法可以治愈一下我这受伤的心灵,还望不灵赐教啊!!!!!!!!!!!!
接下来就进行下面的方法了,参照博客
v4l2采集视频,opencv处理帧数据第一难关:qt的QImage转换为opencv的IplImage 函数代码实现 。
经过网友WICOBOY的帮助,本人换了台电脑终于编译成功,内在原因不是很清楚。 这里贴上WICOBOY的帖子,去他那里下载的库也是可以用的!!
http://www.openhw.org/wicoboy/blog/13-04/293302_71692.html
再次感谢WICOBOY!图像终于不卡了!!!