Zedboard摄像头获取视频设计问题篇(四)-OpenCV+QT配置显示图片

上一篇中运行了一个简单的例子,但是并没有调用摄像头进行图像采集,看了几篇博客也都是对静态图像的基本处理操作。

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!图像终于不卡了!!!

posted on 2013-04-17 14:34  reboot69  阅读(2036)  评论(1编辑  收藏  举报

导航