Balser相机

​ 前段时间,因为项目需要,师傅让我用Qt写巴斯勒相机实时画面的显示,网上找了好多资料,愚笨的我也没有弄明白该如何写,从相机的SDK中找到了用MFC写的例子,咱也没用过MFC呀,看不懂哎,最后师傅出马,写了一下,相机图像转换的位置师傅用他之前写的图像转换类,属于公司产品,我例子中就没用这个类,转而用opencv进行转换(网上找到的方法),本文后面会附上源码。

本程序的环境:

Pylon 6.0.0 + Opencv 4.1.0 +Qt 5.12.3 + Vs 2017 Community

pylon 6.0.0 : Pylon 6.0 下载地址

vs下的头文件包含

下面只说明Balser的头文件包含,opencv 和qt的头文件包含这里忽略。

下载好之后,包含include

在其中填写如下路径:

XXX\Development\include
XXX\Development\Samples\C++\include

XXX\Development\Samples\C++\include路径也可以不包含,我是用来测试sample程序的,本源码就是仿照XXX/Development\Samples\C++\GUI_MFC这个Demo来写的。

下面来包含lib:


在其中填写如下路径:

XXX/Development\lib\x64 #我用的是X64版本的,X86请改为Win32

源码讲解:

main.c
#include "BaslerCamera_RealTimeShow.h"
#include <QtWidgets/QApplication>class PreWork
{
public:PreWork(){Pylon::PylonInitialize();//相机的初始化程序,把它理解为安装}~PreWork(){Pylon::PylonTerminate();//停止运行相机的执行函数,把它理解为卸载}
};int main(int argc, char *argv[])
{PreWork p;//主要说明这一点,巧用构造函数和析构函数,来对相机进行安装和卸载QApplication a(argc, argv);BaslerCamera_RealTimeShow w;w.show();return a.exec();
}
Basler.c
#include "BaslerCamera_RealTimeShow.h"
#include <QDebug>
#include <QPainter>
#include <QRect>BaslerCamera_RealTimeShow::BaslerCamera_RealTimeShow(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);m_camera.RegisterImageEventHandler(this, Pylon::RegistrationMode_ReplaceAll, Pylon::Ownership_ExternalOwnership);// Register this object as a configuration event handler, so we will be notified of camera state changes.// See Pylon::CConfigurationEventHandler for detailsm_camera.RegisterConfiguration(this, Pylon::RegistrationMode_ReplaceAll, Pylon::Ownership_ExternalOwnership);// Add the AutoPacketSizeConfiguration and let pylon delete it when not needed anymore.m_camera.RegisterConfiguration(new CAutoPacketSizeConfiguration(), Pylon::RegistrationMode_Append, Pylon::Cleanup_Delete);m_camera.Attach(Pylon::CTlFactory::GetInstance().CreateFirstDevice(), Pylon::Cleanup_Delete);m_camera.Open();// Camera may have been disconnected.if (!m_camera.IsOpen() || m_camera.IsGrabbing()){return;}// Since we may switch between single and continuous shot, we must configure the camera accordingly.// The predefined configurations are only executed once when the camera is opened.// To be able to use them in our use case, we just call them explicitly to apply the configuration.m_continousConfiguration.OnOpened(m_camera);// Start grabbing until StopGrabbing() is called.m_camera.StartGrabbing(Pylon::GrabStrategy_OneByOne, Pylon::GrabLoop_ProvidedByInstantCamera);ui.centralWidget->installEventFilter(this);//安装Qt的事件过滤器connect(this, SIGNAL(OneImageFinishSignal()), this, SLOT(OneImageFinishSlot()));}void BaslerCamera_RealTimeShow::OnImagesSkipped(Pylon::CInstantCamera& camera, size_t countOfSkippedImages)
{}
void BaslerCamera_RealTimeShow::OnImageGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult)
{m_mutexLock.lock();m_ptrGrabResult = grabResult;//将捕获到的图像传递出去//qDebug() << __FUNCTION__;emit OneImageFinishSignal();m_mutexLock.unlock();}void BaslerCamera_RealTimeShow::OneImageFinishSlot()
{//qDebug() << __FUNCTION__;ui.centralWidget->update();
}
bool BaslerCamera_RealTimeShow::eventFilter(QObject *watched, QEvent *event)
{if (watched == ui.centralWidget && event->type() == QEvent::Paint){showImage();}return false;
}
void BaslerCamera_RealTimeShow::showImage()
{   m_mutexLock.lock();//qDebug() << "123" << endl;// 新建pylon ImageFormatConverter对象.CImageFormatConverter formatConverter;Mat openCvImage;QPainter painter(ui.centralWidget);//确定输出像素格式formatConverter.OutputPixelFormat = PixelType_BGR8packed;//将抓取的缓冲数据转化成pylon image.formatConverter.Convert(m_bitmapImage, m_ptrGrabResult);// 将 pylon image转成OpenCV image.openCvImage = cv::Mat(m_ptrGrabResult->GetHeight(), m_ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *)m_bitmapImage.GetBuffer());QImage img((const unsigned char *)(openCvImage.data), openCvImage.cols, openCvImage.rows, openCvImage.cols * 3, QImage::Format_RGB888);QRectF target;target.setLeft(0);target.setTop(0);target.setSize(this->size());QRectF source;source.setLeft(0);source.setTop(0);source.setSize(img.size());painter.drawImage(target,img, source);m_mutexLock.unlock();}// Pylon::CConfigurationEventHandler functions
void BaslerCamera_RealTimeShow::OnAttach(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnAttached(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnDetach(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnDetached(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnDestroy(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnDestroyed(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnOpen(Pylon::CInstantCamera& camera)
{Pylon::String_t strFriendlyName = camera.GetDeviceInfo().GetFriendlyName();qDebug() << __FUNCTION__ << " - " << strFriendlyName.c_str();
}void BaslerCamera_RealTimeShow::OnOpened(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnClose(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnClosed(Pylon::CInstantCamera& camera)
{Pylon::String_t strFriendlyName = camera.GetDeviceInfo().GetFriendlyName();qDebug() << __FUNCTION__ << " - " << strFriendlyName.c_str();
}void BaslerCamera_RealTimeShow::OnGrabStart(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnGrabStarted(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnGrabStop(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnGrabStopped(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;m_camera.DeregisterConfiguration(&m_continousConfiguration);
}void BaslerCamera_RealTimeShow::OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage)
{qDebug() << __FUNCTION__;
}void BaslerCamera_RealTimeShow::OnCameraDeviceRemoved(Pylon::CInstantCamera& camera)
{qDebug() << __FUNCTION__;
}BaslerCamera_RealTimeShow::~BaslerCamera_RealTimeShow()
{Perform cleanup.if (m_camera.IsPylonDeviceAttached()){try{// Close camera.// This will also stop the grab.m_camera.Close();// Free the camera.// This will also stop the grab and close the camera.m_camera.DestroyDevice();}catch (const Pylon::GenericException& e){qDebug() << e.what();}}
}
Balser.h
#pragma once#include <QtWidgets/QMainWindow>
#include "ui_BaslerCamera_RealTimeShow.h"
#include "AutoPacketSizeConfiguration.h"//加载PYLON API.
#include <pylon/PylonIncludes.h>
#include <pylon/gige/BaslerGigECamera.h>
#include <iostream>
#include <QMutex>// 加载OpenCV API
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>
#include <opencv2/opencv.hpp>//命名空间.
using namespace Pylon;
using namespace std;
using namespace cv;class BaslerCamera_RealTimeShow : public QMainWindow                                     , public Pylon::CImageEventHandler             // Allows you to get informed about received images and grab errors., public Pylon::CConfigurationEventHandler     // Allows you to get informed about device removal.{Q_OBJECTsignals:void OneImageFinishSignal();
private slots:void OneImageFinishSlot();public:BaslerCamera_RealTimeShow(QWidget *parent = Q_NULLPTR);~BaslerCamera_RealTimeShow();private:Ui::BaslerCamera_RealTimeShowClass ui;Pylon::CInstantCamera m_camera;// The grab result retrieved from the cameraPylon::CGrabResultPtr m_ptrGrabResult;// The grab result as a windows DIB to be displayed on the screenPylon::CPylonBitmapImage m_bitmapImage;Pylon::CAcquireContinuousConfiguration m_continousConfiguration;QMutex m_mutexLock;protected:void showImage();virtual bool eventFilter(QObject *watched, QEvent *event);// Pylon::CImageEventHandler functionsvirtual void OnImagesSkipped(Pylon::CInstantCamera& camera, size_t countOfSkippedImages);virtual void OnImageGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult);// Pylon::CConfigurationEventHandler functionsvirtual void OnAttach(Pylon::CInstantCamera& camera);virtual void OnAttached(Pylon::CInstantCamera& camera);virtual void OnDetach(Pylon::CInstantCamera& camera);virtual void OnDetached(Pylon::CInstantCamera& camera);virtual void OnDestroy(Pylon::CInstantCamera& camera);virtual void OnDestroyed(Pylon::CInstantCamera& camera);virtual void OnOpen(Pylon::CInstantCamera& camera);virtual void OnOpened(Pylon::CInstantCamera& camera);virtual void OnClose(Pylon::CInstantCamera& camera);virtual void OnClosed(Pylon::CInstantCamera& camera);virtual void OnGrabStart(Pylon::CInstantCamera& camera);virtual void OnGrabStarted(Pylon::CInstantCamera& camera);virtual void OnGrabStop(Pylon::CInstantCamera& camera);virtual void OnGrabStopped(Pylon::CInstantCamera& camera);virtual void OnGrabError(Pylon::CInstantCamera& camera, const char* errorMessage);virtual void OnCameraDeviceRemoved(Pylon::CInstantCamera& camera);};

main.c内容很简单,执行安装和卸载的函数

Balser.c在这里着重说明一下:

先说一下Balser获取实时图像的原理吧,网上也有很多,这里按照我的理解写一下。

1、Basler获取实时图像是一张一张的拍照,拍照-显示-拍照-显示…,所以我们看到的就是连续的图像。

2、Basler是事件驱动的,当拍完一张照片之后,会触发事件,然后执行的Balser提供的OnImageGrabbed函数, 这个原理可以理解为Qt的信号-槽

Balser.c的程序流程

捕获图像 —> 触发信号(事件)—> 执行OnImageGrabbed()函数,将图像保存到我们定义的类中(这里注意下m_mutexLock.lock();的使用,因为巴斯勒相机处理图像是多线程的,所以在使用变量的时候,要用线程锁保护)—>发送我们自定义的信号-因为构造函数已经连接好了信号与槽-执行OneImageFinishSlot()中的updata触发 event事件,判断该窗体时centralWidget,事件为QEvent::Paint,执行显示函数showImage()。显示函数就是把图像转换一下格式,用Painter画一下图(也用到了线程锁)

最后的源码:

​ 总结一下,本人实力有限,写的比较啰嗦,希望大家能看懂。

​ 如果大家下载源码,附上CSDN和Gitee链接,如果大家CSDN积分多,就赞助点小弟,如果没有积分,请使用Gitee链接。

最后附上下载链接:

CSDN链接地址:CSDN

Gitee链接地址:Gitee

Basler相机实时图像显示--Qt代码相关推荐

  1. 【basler】Chapter5:basler相机C#代码实现与详解(基础版)

    1.简介 这里对basler相机的C#开发代码进行最基础的解释 2.引用库 Basler.Pylon.dll 3.几种方法 (1)图片格式转换 private PixelDataConverter c ...

  2. Basler相机QT代码vs

    代码 MainWindow.h /********************************************* * 说明:Basler相机主界面. * 修改日期:20210625 * 作 ...

  3. 【basler】Chapter5:basler相机C#代码实现与详解

    1.简介 最近使用basler相机,摸索了一段时间,找过一些其他的代码,有的不管用,有的只能拍照,无法处理相片流.其中有一个博客代码简洁明了,可以做入门学习,但是只能拍照不能录像: https://b ...

  4. 基于Qt的Basler相机开发记录

    最近鼓捣了将近两个礼拜的basler相机,现在做一个二次开发的记录,方便后面的使用和学习 一般的工业相机的开发从打开相机到采集图片再到关闭相机的步骤流程如下: 枚举设备 创建句柄 打开设备 开始抓图 ...

  5. 大恒相机Python版Qt界面(一)

    更新:2022/11/18 代码已完成,详情请参考:大恒相机Python版Qt界面(二)_△ф的博客-CSDN博客 首先,很抱歉之前写的Qt.C++的UI界面鸽了...这次的大恒相机界面python版 ...

  6. 大恒相机Python版Qt界面(二)

    书接上回:大恒相机Python版Qt界面(一)_△ф的博客-CSDN博客_python大恒.目前,基于PyQt5的大恒相机UI界面开发已基本完成,总体界面如下: 该UI界面中,主要包括了相机使用中的几 ...

  7. 通过python调用海康威视工业摄像头并进行图像存储,同时使用opencv实时图像显示(数据流问题已解决)

    通过python调用海康威视工业摄像头并进行图像存储,同时使用opencv实时图像显示. 1:图像存储方式 先说情况,本人是做视觉检测的需要高倍率摄像头进行实时检测,也就是需要深度学习进行图片数据处理 ...

  8. 项目总结之Basler相机的调用

    需求 项目要求一个后台服务,通过交换机连接并监控多个Basler相机,项目的细节点就在于实时监控配置列表中所有的相机(相机未在线等待事件,相机断连事件,相机参数初始化,相机拍照结果返回获取等) 连接相 ...

  9. ubuntu basler相机opencv

    一.下载安装balser SDK https://www.baslerweb.com/cn/downloads/software-downloads/#type=pylonsoftware 选择5.2 ...

  10. 基于pylon嵌入式目标应用(Basler相机)

    基于pylon嵌入式目标应用(Basler相机) 1简介 pylon Camera软件套件(简称"pylon")是Basler的软件包,它包含易于使用的SDK.驱动程序和工具,使您 ...

最新文章

  1. 一顿“寄生虫大餐”,或能治好干净引来的免疫病
  2. 安装带有调试信息的C库
  3. SQL Server调优系列基础篇(联合运算符总结)
  4. ASP.NET Session的七点认识(转)
  5. 从命令行获取两个路径名称并找出文件一样内容一样的两个文件
  6. html5翻卡片游戏,用 JavaScript 写一个卡片小游戏
  7. 查看nginx版本_2:快速搭建Nginx
  8. php登陆页添加记住密码选项,PHP 实现登录记住密码
  9. bat中ERRORLEVEL的使用介绍
  10. 桌面ie图标删不掉的解决技巧
  11. 湖南启动CCTV《星光达人秀》 《宾导会客厅》全球直播发布
  12. 2017年1月手机分析报告
  13. Pytorch:图像语义分割-FCN, U-Net, SegNet, 预训练网络
  14. 微信WeUI扩展组件
  15. 试题 算法训练 礼物
  16. spyder crashed during last session
  17. 这种 Github 不要写在简历上!你们有没有写过?
  18. Android股票K线图
  19. Broadcast功能
  20. Lucene倒排索引

热门文章

  1. usb3.0速度测试软件,主流B75原生SATA3.0和USB3.0速度测试
  2. 解决管家婆7在SQL2008上安装不了问题
  3. 安利一款倒计时插件---雨滴桌面
  4. 从高德地图获取城市地铁线路+站点
  5. uniapp微信小程序使用canvas自定义分享名片
  6. EtherCAT运动控制器的PLC编程(一) 直线插补
  7. 韩立刚计算机网络笔记-第01章 计算机网络详解
  8. 备战秋招之数电模电知识点
  9. python qt designer
  10. iOS Xcode如何打包ipa安装包