Qt+BASLER相机+OpenCV

一、准备工作

相机型号:BASLER acA 1920-40gc

软件:pylon5,Qt,

用开发者模式安装pylon后,找到 Basler\pylon 5\Development\Samples\C++ 文件夹,我选择的是默认安装,所以路径是C:\Program Files\Basler\pylon5\Development\Samples\C++打开工程因为我的相机是GigE接口,所以我打开PylonSamples_GigE.sln编译就可以运行啦

二、示例工程

http://blog.csdn.net/u013351270/article/details/54290452

里边自带很多示例工程,工程的名字及作用如下:

  • DeviceRemovalHandling 这个示例程序演示了如何移除相机设备。它还显示如何重新连接到已删除的设备.。
  • Grab 这个例子演示了如何抓取过程中采用cinstantcamera类图像。图像是抓住和异步处理,当应用程序处理一个缓冲区,缓冲区的下一个收购是平行进行的,cinstantcamera类使用一个缓冲池,从摄像头获取图像数据。缓冲区填充完毕后,可以从相机对象检索缓冲区进行处理.。在抓取结果中收集缓冲区和附加图像数据。抓取结果由智能指针在检索后保持.。当显式释放或智能指针对象被销毁时,缓冲区将自动重复使用.。
  • Grab_camera_EventsGigE :在这个示例中显示了如何注册指示摄像机发送的事件到达的事件处理程序。 为了演示目的,为同一个事件注册了几个不同的处理程序。
  • Grab_ChunkImage Basler相机提供块特征:相机可以生成每个图像的某些信息,如帧计数器,时间戳,和CRC校验,这是附加到图像数据的“块”。此示例说明如何启用块特性、如何抓取图像以及如何处理附加数据.。当相机处于块模式时,它将被划分成块的数据块传输.。第一个块总是图像数据.。当启用块特性时,图像数据块后面的块包含包含块特征的信息.。
  • Grab_MultiCast.cpp  此示例演示如何在多播模式下打开照相机以及如何接收多播流。
  • Grab_MultipleCameras 这个例子演示了如何抓取和处理来自多个摄像机的图像,使用cinstantcameraarray类。 
  • Grab_Strategies 这个例程显示了使用即时相机抓取策略。
  • Grab_UsingBufferFactory此示例演示用户提供的缓冲工厂的使用.。 缓冲工厂的使用是可选的,仅用于高级用例.。如果您打算抓取外部提供的缓冲区,则只需要缓冲工厂.。
  • Grab_UsingExposureEndEvent 此示例演示如何使用曝光结束事件以加快图像获取.。例如,当传感器曝光完成后,相机可以发送一个曝光结束事件的PC。PC可以接收事件之前的图像数据的成品曝光已被完全转移。这可以用来避免不必要的延迟,例如在相关的图像数据传输完成之前,成像对象被进一步移动。
  • Grab_UsingGrabLoopThread 此示例说明如何使用即时照相机类提供的抓取循环线程来抓取和处理图像.。 按下T获取一幅图像
  • GUI_ImageWindow 这个例子演示了如何显示图像使用cpylonimagewindow类。在这里,图像被抓取,分割成多个瓦片,每个平铺显示在一个单独的图像窗口。
  • ParametrizeCamera_AutoFunctions 本示例说明如何使用Basler相机的“自动功能”功能。
  • ParametrizeCamera_Configurations此示例演示如何通过使用标准配置和注册示例配置事件处理程序来使用配置事件处理程序。
  • ParametrizeCamera_GenericParameterAccess.本示例演示使用genapi节点图的genapi表示配置相机的“通用”的方法::inodemap接口。名称和参数节点类型可以在巴斯勒塔程序员指南和API参考,在相机的用户手册,相机中的文件登记的结构和访问方法(如果适用),并利用塔查看器工具  x y offsetheight width
  • ParametrizeCamera_LoadAndSave 保存和读取相机参数!先读取后保存
  • ParametrizeCamera_LookupTable  本示例程序演示了使用亮度查找表功能。
  • ParametrizeCamera_NativeParameterAccess 此示例显示了使用设备特定的即时相机类配置相机的“原生”方法。
  • ParametrizeCamera_Shading  只有线阵相机支持
  • ParametrizeCamera_UserSets  演示如何使用用户配置集(用户集)以及如何配置摄像机以用户set1的用户定义设置启动。 您也可以使用pylon Viewerand配置您的相机,并将您的自定义设置存储在您选择的用户组中
  • Utility_GrabAvi.  本示例说明如何以音频视频交错(AVI)格式创建视频文件。
  • Utility_Image 本示例说明如何使用pylon图像类CPylonImage和CPylonBitmapImage。 
  • Utility_ImageFormatConverter  本示例演示了如何使用图像格式转换器类CImageFormatConverter。
  • Utility_ImageLoadAndSave 本示例说明如何加载和保存图像。

三、Pylon结构与枚举

参考:http://blog.csdn.net/liyuanbhu/article/details/74613768

四、Pylon5 SDK开发

参考:http://www.cnblogs.com/star91/p/6747946.html

在.pro文件中添加如下代码,注意前提是OpenCV的库也要配好,如果没有配,参考之前的文章配置http://blog.csdn.net/zong596568821xp/article/details/78819275:

OpenCV环境:

INCLUDEPATH += C:\opencv\opencv\build\include \
               C:\opencv\opencv\build\include\opencv \
               C:\opencv\opencv\build\include\opencv2 \


win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../opencv/opencv/build/x64/vc14/lib/ -lopencv_world320
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../opencv/opencv/build/x64/vc14/lib/ -lopencv_world320d
else:unix: LIBS += -L$$PWD/../../../../opencv/opencv/build/x64/vc14/lib/ -lopencv_world320

INCLUDEPATH += $$PWD/../../../../opencv/opencv/build/x64/vc14
DEPENDPATH += $$PWD/../../../../opencv/opencv/build/x64/vc14

Pylon环境:

INCLUDEPATH += \
$$(PYLON_DEV_DIR)/include \
$$(PYLON_DEV_DIR)/include/pylon

LIBS += \
-L$$(PYLON_DEV_DIR)/lib/x64

注意如果电脑是64位系统,要添加x64的LIBS,如果电脑是32位,则添加Win32的LIBS

使用Pylon5 SDK搭配OpenCV采集图像程序流程如下:


在mainwindow.cpp中添加如下代码,该工程使用Basler acA1920-40gc GigE 相机测试成功。

#include "mainwindow.h"
#include "ui_mainwindow.h"

//定义是否保存图片 0-否 1-是
#define saveImages 1
//定义是否记录视频 0-否 1-是
#define recordVideo 1

// 加载OpenCV API
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>

//加载PYLON API.
#include <pylon/PylonIncludes.h>
#include <pylon/gige/BaslerGigECamera.h>
#include<iostream>

#ifdef PYLON_WIN_BUILD
#include <pylon/PylonGUI.h>
#endif

//命名空间.
using namespace Pylon;
using namespace cv;
using namespace std;
//定义抓取的图像数
static const uint32_t c_countOfImagesToGrab = 10;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // read an image
    //cv::Mat image = cv::imread("d://1.jpg", 1);
    // create image window named "My Image"
    //cv::namedWindow("My Image");
    // show the image on window
    //cv::imshow("My Image", image);

    //Pylon自动初始化和终止
    Pylon::PylonAutoInitTerm autoInitTerm;
    try
    {
        //创建相机对象(以最先识别的相机)
        CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
        // 打印相机的名称
        std::cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;
        //获取相机节点映射以获得相机参数
        GenApi::INodeMap& nodemap = camera.GetNodeMap();
        //打开相机
        camera.Open();
        //获取相机成像宽度和高度
        GenApi::CIntegerPtr width = nodemap.GetNode("Width");
        GenApi::CIntegerPtr height = nodemap.GetNode("Height");

        //设置相机最大缓冲区,默认为10
        camera.MaxNumBuffer = 5;
        // 新建pylon ImageFormatConverter对象.
        CImageFormatConverter formatConverter;
        //确定输出像素格式
        formatConverter.OutputPixelFormat = PixelType_BGR8packed;
        // 创建一个Pylonlmage后续将用来创建OpenCV images
        CPylonImage pylonImage;

        //声明一个整形变量用来计数抓取的图像,以及创建文件名索引
        int grabbedlmages = 0;

        // 新建一个OpenCV video creator对象.
        VideoWriter cvVideoCreator;

        //新建一个OpenCV image对象.
        Mat openCvImage;

        // 视频文件名
        std::string videoFileName = "openCvVideo.avi";

        // 定义视频帧大小
        cv::Size frameSize = Size((int)width->GetValue(), (int)height->GetValue());

        //设置视频编码类型和帧率,有三种选择
        // 帧率必须小于等于相机成像帧率
        cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V','X'), 10, frameSize, true);
        //cvVideoCreator.open(videoFileName, CV_F0URCC('M','P',,4','2’), 20, frameSize, true);
        //cvVideoCreator.open(videoFileName, CV_FOURCC('M', '3', 'P', 'G'), 20, frameSize, true);

        // 开始抓取c_countOfImagesToGrab images.
        //相机默认设置连续抓取模式
        camera.StartGrabbing(c_countOfImagesToGrab, GrabStrategy_LatestImageOnly);

        //抓取结果数据指针
        CGrabResultPtr ptrGrabResult;

        // 当c_countOfImagesToGrab images获取恢复成功时,Camera.StopGrabbing()
        //被RetrieveResult()方法自动调用停止抓取

        while (camera.IsGrabbing())

        {
            // 等待接收和恢复图像,超时时间设置为5000 ms.
            camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException);

            //如果图像抓取成功
            if (ptrGrabResult->GrabSucceeded())
            {
                // 获取图像数据
                cout <<"SizeX: "<<ptrGrabResult->GetWidth()<<endl;
                cout <<"SizeY: "<<ptrGrabResult->GetHeight()<<endl;

                //将抓取的缓冲数据转化成pylon image.
                formatConverter.Convert(pylonImage, ptrGrabResult);

                // 将 pylon image转成OpenCV image.
                openCvImage = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *) pylonImage.GetBuffer());

                //如果需要保存图片
                if (saveImages)
                {
                   std::ostringstream s;
                    // 按索引定义文件名存储图片
                   s << "image_" << grabbedlmages << ".jpg";
                   std::string imageName(s.str());
                    //保存OpenCV image.
                   imwrite(imageName, openCvImage);
                   grabbedlmages++;
                }

                //如果需要记录视频
                if (recordVideo)
                {
                    cvVideoCreator.write(openCvImage);
                }

                //新建OpenCV display window.
                namedWindow("OpenCV Display Window", CV_WINDOW_NORMAL); // other options: CV_AUTOSIZE, CV_FREERATIO
                //显示及时影像.
                imshow("OpenCV Display Window", openCvImage);

                // Define a timeout for customer's input in
                // '0' means indefinite, i.e. the next image will be displayed after closing the window.
                // '1' means live stream
                waitKey(1);

            }

        }

    }
    catch (GenICam::GenericException &e)
    {
        // Error handling.
        cerr << "An exception occurred." << endl
            << e.GetDescription() << endl;
    }
    return;
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行成功后,显示如下界面(不知为什么,我的相机读出来是黑的——后来发现是镜头的问题,换了镜头就好了)

 
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页