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

  • 相关阅读:
    错误与异常_2-11选择题
    错误与异常_2-10选择题
    错误与异常_2-8选择题
    错误与异常_2-7选择题
    C#定时器
    C#动态webservice调用接口
    C# webservice返回Xml格式文件
    C#创建简单的Xml文件
    获取数据库中指定类型的数据库名称
    C#生成Xml以UTF-8无BOM格式编码
  • 原文地址:https://www.cnblogs.com/preorder69/p/3013074.html
Copyright © 2020-2023  润新知