Basler|5.Pylon 相机程序开发中的若干总结

Basler工业相机python开发(Pypylon) basler相机pypylon开发 阅读详情

http://blog.youkuaiyun.com/wenzhou1219/article/details/7543658

1.内存泄露问题

尽管内存泄露的原理和解决办法很简单,但是还是有很多人会不自觉的写出内存泄露的程序来,尽管有时候他们的程序并没有运行足够的时间来让他们或客户发现问题,但是了解如何有效的避免内存泄露总是不错的。

一般来说,内存泄露主要是由于申请了相应的资源,但是使用它以后并没有释放。如果只是简单地程序,那很容易避免内存泄露的问题,但是如果,在一个程序中同一个指针p指向的内存区在不同函数间不停的申请和释放,天知道最后p指向的内存是不是被释放了(尽管有时候,少部分狂热分子会拨开层层迷雾去一探究竟,但这是不必要的)。那么如何来解决这个问题呢。

首先,这里用C++来做示例,我们来看一看自己申请的内存区

假设定义 char *p ;

然后p = new  char[5] ;

。。。

。。。若干个释放和申请。。。

。。。

现在p指向的内存释放了吗?

有人说,管他三七二十一,再释放一下delete [] p ;

这样显然是不行的,若p巧合没有释放还好,若p已经释放了那就会出问题,这时的指针即所谓的“野指针”是无效的

正确的做法是先对指针做个初始化,p=NULL;(顺便提一句,对于任何变量都做初始化是个不错的主意,他们并占不了什么执行时间,但是却能够带来意想不到的作用,避免很多的错误)

然后在需要释放内存的地方如下处理

    if (NULL != p)
    {
        delete [] p ;
        p = NULL ;
    }

记住,一旦释放了指针以后,立刻将指针指向NULL,防止“野指针”的出现

当然若程序要多次申请资源,如下处理

    if (NULL == p)
    {
          p = new  char[5] ;
    }


然后,

然而很多由系统定义的资源分配,如windows的HANDLE,MIL的MIL_ID,Pylon的PYLON_DEVICE_HANDLE等等,有时候你并不知道他们是不是指针,是否可以用NULL来初始化标志,以及在使用过程中是否会出现值为NULL的情况,这时候用NULL来标识他们是否已经分配或释放会不可靠(其实HANDLE是可行的,他是指向指针的指针,细节此处不详述)。

对于这种情况,有两种办法,一看他的说明,了解其错误分配时的返回值,如HANDLE为NULL,MIL_ID为M_NULL,将上述p例子中的NULL换成相应的错误返回值即可;二倘若没有指名返回值,如PYLON_DEVICE_HANDLE,那么可以设定一个和该变量相关的标志变量来指明该资源是否已经分配。


2.资源阻塞

打我们用OpenFile打开文件,当指定OF_SHARE_DENY_READ属性时,那么两个进程就不能同时读取这个文件的内容,我称这种状况为资源阻塞。对于资源阻塞的方式可以猜想:1.在打开该文件的同时,再建立建立一个文件记录相关打开和操作信息,如Access(甚至两个线程不允许同时访问同一个文件)和Word,2.在该文件中有特定的标志位段来记录文件打开关闭的信息。

在打开相机操作和打开数据流抓取对象后,再打开相机或数据流抓取对象会出错;意外退出程序若没有做好相关的清理工作,再打开相机或数据流抓取对象也会出错。猜想相机在连接上电脑以后,会自动建立一个文件记录文件打开,关闭和操作相关的信息。打开相机后此时再打开相机时,检测相机相关标识发现已经打开了相机就报错;程序意外出错,退出程序时若没有将相关的标志位置原来正确时的值,再打开程序时检查相关的标志位仍然是错误的,这个显然是不对的。那么解决在打不开相机呢,很简单,此时可以将相机拔下再重插,让相关标志复位即可。如何避免这个问题呢,其实还是和防止内存泄露一样,设置一个标志变量,在打开和意外程序终止时检验相关标志位,做好清理工作。这样才能保证程序的完整性和好的鲁棒性。


3.类和回调函数

由于在类中创建一个线程时要指定回调函数的地址,这时候有两种办法:一是指定一个全局的函数,二是指定类的static函数,但是如果我们想在static函数中访问非static成员变量是个问题,可以如下来解决

Thread.h

  1. #ifndef THREAD_H_H  
  2. #define THREAD_H_H  
  3.   
  4. class Thread  
  5. {  
  6. public:  
  7.     HANDLE m_hThread ;  
  8.     int m_num ;  
  9.   
  10.     Thread() ;  
  11.     ~Thread() ;  
  12.     void Create() ;  
  13.     static DWORD WINAPI ThreadProc(LPVOID lpParameter);  
  14.     int PrintNum() ;  
  15. };  
  16.   
  17. #endif  

Thread.cpp

  1. #include <IOSTREAM>  
  2. using namespace std;  
  3. #include <windows.h>  
  4. #include "Thread.h"  
  5.   
  6. Thread::Thread()  
  7. {  
  8.     m_num = 80 ;  
  9. }  
  10.   
  11. Thread::~Thread()  
  12. {  
  13.       
  14. }  
  15.   
  16. void Thread::Create()  
  17. {  
  18.     ::CreateThread(NULL, 0, ThreadProc, LPVOID(this), 0, NULL) ;  
  19. }  
  20.   
  21. /*在类中static静态函数属于类,不属于哪个对象, 
  22. 故调用该函数时不会传进this指针,即默认访问不了非static 
  23. 变量,这里模拟传进this指针可以使用对象的非static静态变量*/  
  24. DWORD WINAPI Thread::ThreadProc( LPVOID lpParameter )  
  25. {  
  26.     Thread * This = (Thread *)lpParameter ;  
  27.     return This->PrintNum() ;  
  28. }  
  29.   
  30. int Thread::PrintNum()  
  31. {  
  32.     cout << "Num的值为" << m_num << endl ;  
  33.     return 0 ;  
  34. }  

Main.cpp
  1. #include <IOSTREAM>  
  2. using namespace std;  
  3. #include <windows.h>  
  4. #include "Thread.h"  
  5.   
  6. int main()  
  7. {  
  8.     Thread test ;  
  9.   
  10.     test.Create() ;  
  11.     Sleep(10) ;         //让副线程运行  
  12.   
  13.     return 0 ;  
  14. }  
执行结果为
这样即可解决问题。
Basler相机回调模式(C++) 【代码】Basler相机回调模式(C++) 阅读详情

相关推荐

VS(C#)调用Basler相机SDK采集图像及基本功能设定

使用到了Basler的相机,利用C#编写的SDK,下面进行简单的整理记录。 首先引用basler的动态库文件,具体引用位置如下: 安装目录\Basler\pylon 5\Development\Assemblies\Basler.Pylon\x64\Basler.Pylon.dll 引用命名空间 using Basler.Pylon; using System; using System.Col...

大樱桃的博客 2万+

5.Pylon 相机程序开发中的若干总结

1.内存泄露问题 尽管内存泄露的原理和解决办法很简单,但是还是有很多人会不自觉的写出内存泄露的程序来,尽管有时候他们的程序并没有运行足够的时间来让他们或客户发现问题,但是了解如何有效的避免内存泄露总是不错的。 一般来说,内存泄露主要是由于申请了相应的资源,但是使用它以后并没有释放。如果只是简单地程序,那很容易避免内存泄露的问题,但是如果,在一个程序中同一个指针p指向的内存区在不同函数间不停的申

文洲的专栏 6604

Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机

一 、在Linux操作系统中安装Pylon软件     1、Pylon下载,到官网中下载Pylon软件https://www.baslerweb.com/cn/support/downloads/software-downloads/#os=linuxx86;version=all         根据自己的系统选择x86或者x86_64(即x64)版本。    2、下载好后,对压缩包进

qq_29229045的博客 8407

C#做Basler相机二次开发遇到的问题总结

1.问题描述 在做项目的时候需要连接basler相机实时显示和保存图片,植入相机二次开发代码后正常打开显示,但运行一段时间后程序就会奔溃,事件名:bex,故障模块clr.dll(过去一段时间了,原谅没有图片),当时在网上查了很久,关于这个错误的描述很模糊,一直无法找出原因,相当诡异的是用编译器调试运行完全没问题,回家过年用编译器运行了一个多月,生成执行文件运行不到一个小时就奔溃(都快被折腾崩溃了)...

zengjunyan的博客 1906

基于MFC的Basler工业相机SDK开发

一、软、硬件准备 VS2017 opencv3.4.6 相机:Basler acA2500-14gm 驱动:pylon 二、软硬件配置 下载安装pylon,到basler官方网站下载适合自己相机的pylon版本(我的是pylon 5.0),安装的时候注意选择安装开发者模式(开发者模式才含有SDK)。搜索相机IP并改成固定IP,使系统和相机利用路由器连接在同一个局域网内。 打开Pylon Vi...

weixin_44623637的博客 4845

Windows10下pylon Viewer读取basler相机图像

Windows10 (64-Bit)运行软件:pylon Viewer 64-Bit,pylon Release 6.3.0采集basler相机acA 1920-25gc的图像流程及步骤,又侧图像区域空白或绿色的解决方法。​ 对角灰色渐变条纹 是相机的测试图像,相机的 Test Images功能可让您检查相机的基本功能及其传输图像的能力。 测试图像可用于维护目的和故障诊断。它们是由相机本身生成的。因此,相机的光学元件或成像传感器未参与其创建。

abanchao的博客 8676

Basler Blaze-101开发实践(2)——触发采图

目录前言 前言

zwz_chome的博客 1762

Windows环境下Basler相机与pylon Viewer的快速配置指南

本文详细介绍了在Windows环境下如何快速配置Basler相机与pylon Viewer,包括驱动安装、设备连接、参数调优等关键步骤。通过实战技巧和常见问题解决方案,帮助用户高效完成工业相机系统的部署与优化,特别适合工业检测和医疗影像领域的应用。

weixin_29285605的博客 1149

Basler pylon安装及对网口相机基本设置

Pylon安装及采图操作 从basler官网上下载与当前操作系统适配的pylon版本,官网下载链接如下,https://www.baslerweb.com/cn/sales-support/downloads/software-downloads/pylon-5-...

lighter 2万+

basler相机的调试与配置以及多相机同时运行(完整版)

basler相机的调试与配置以及多相机同时运行(完整版)

qq_45843546的博客 7379

Qt msvc使用basler 相机pylon sdk进行windows编程测试

环境配置 官网下载pylon sdk的进行安装即可,教程很多,不细说 pro环境配置 #--------------------------------------------Basler------------------------------------------- INCLUDEPATH += $$PWD/include LIBS += -L$$PWD/lib/Win32 -lGCBas...

西门吹雪 1152

basler相机pylon安装及API调用

1.官网下载basler相机的pylon 2.安装pylon 2.1选择pylon的模式,二次开发选择development模式 2.2选择接口,看相机的接口类型,选择相机的接口类型一般为GitE和USB类型 3.完后安装就打开Pylon Viewer ...

weixin_44840658的博客 1万+

简单记录一次拿网站后台的过程

本文章重在让大家了解拿后台的逻辑与流程,请不要利用此文章的内容对别人的网站进行攻击破坏,否则后果自负,作者不承担任何责任。

kk的博客 920

vs2015使用c++的basler相机的pylon软件的配置、opencv的配置

vs2015使用c++的basler相机的pylon软件的配置、opencv的配置 配置basler相机 1.新建个项目 2.新建个源程序,做测试用 //定义是否保存图片 #define saveImages 1 //定义是否记录视频 #define recordVideo 1 // 加载OpenCV API #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <o

qq_41731051的博客 3170

dify离线部署

以bge-m3为例,本地部署bge-m3首先在一台能连网的linux服务器上(部署有ollama)创建想要保存模型的文件夹编辑ollama.service,配置ollama模型的保存路径添加模型存储地址将models目录设置属主,必须做,否则ollama无法启动重新加载配置文件并重启ollama测试ollama 运行是否正常最后拉取 bge-m3可在/opt/LLMModels/bge_m3/models目录下看到拉取得模型使用tar命令压缩文件夹。

weixin_42538734的博客 3071

提升仿真效率:Synopsys VCS高级编译选项优化技巧(2023最新版)

本文深入探讨了Synopsys VCS 2023版本中的高级编译选项优化技巧,帮助工程师提升仿真效率。通过并行编译、智能代码分析、精准覆盖率采样等策略,结合真实案例展示如何显著缩短仿真周期并优化资源使用,适用于数字芯片验证和大型SoC设计。

weixin_30338481的博客 114

【Qt 学习之路】调用工业相机Basler的SDK使用示例

由于公司采购的AVT相机不足,需要用Basler相机来弥补,所以我也了解了一下Basler这款相机的SDK。由于Basler这边的相机提供的没有提供Qt的示例,所以我做一个分享出来。本篇的Demo采用的是工业黑白相机。工业应用中,如果我们要处理的是与图像颜色有关,那么我们最好采用彩色工业相机;如果不是,那么我们最好选用黑白工业相机,因为在同样分辨率下的工业相机,黑白工业教学精度比彩色工业相机高,尤其是在看图像边缘的时候,黑白工业相机的效果更好。

沙师弟专栏 7万+

机械臂 关节电机选型计算

电机 机械臂

hisen92的专栏 8983

Basler相机外部触发设置

一、相机硬件接线图 2号引脚接传感器的触发信号引脚,5号与传感器共地连接。 二、pylon软件设置 三、halcon软触发相机拍照 Halcon采集助手设置软触发: 1.set_framegrabber_param (AcqHandle, 'TriggerMode', 'On') 2.set_framegrabber_param (AcqHandle, 'TriggerS...

Devin的博客 1万+

D触发器版图设计的艺术:最小化面积与最大化性能的平衡之道

本文探讨了D触发器版图设计中如何平衡最小化面积与最大化性能的核心挑战。通过分析晶体管布局、互联优化、时钟分布等关键策略,结合先进制程下的功耗与信号完整性考量,为数字IC工程师提供了从基础优化到制造验证的实用解决方案,助力实现高性能、低面积的芯片设计。

aa123的博客 910

基于STM32的智能鱼缸设计

为了缓解学习、生活、工作带来的压力,提升生活品质,许多人喜欢在家中、办公室等场所养鱼。为节省鱼友时间、劳力、增加养鱼乐趣;为此,本文基于STM32单片机设计了一款智能鱼缸。该鱼缸可以实现水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能为一体的控制系统,可通过控制键进行一键控制。...

1万+

Basler相机抓取图像并保存 Pylon

使用Pylon获取相机图片主要使用函数PylonDeviceGrabSingleFrame(PYLON_DEVICE_HANDLE hDev, size_t channel, void * pBuffer, size_t bufferSize, PylonGrabResult_t *pGrabResult, _Bool *pReady, uint32_t timeout);其中channel自己设定

a563562675的博客 1万+

YOLO训练/写作脚本目录一览 | 涉及标签格式转换、数据扩充、热力图、感受野、精度曲线、数量统计等近百个脚本文件

在大家购买专栏后,便可获得全部的脚本文件。在获取到文件后,只需按照将程序放在个人项目中即可一键运行。

Limiiiing的博客 2376

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

基于pylon嵌入式目标应用(Basler相机) 1简介 pylon Camera软件套件(简称“pylon”)是Basler的软件包,它包含易于使用的SDK、驱动程序和工具,使您能够将Basler相机集成到自己的应用程序中。pylon提供以下组件: 不同摄像头接口所需的所有驱动程序(GigE Vision、USB3 Vision、MIPI CSI-2等)。 pylon Viewer:一个强大的GUI工具,用于配置相机和抓取图像或视频。它在开发过程中也提供了宝贵的支持。 易于使用的API,用于不同的编程语言

chocolate2018的博客 3823

STM32串口控制LED灯的亮灭

STM32中的串口控制LED灯的亮灭,分为两种方式,一种是直接发送数字0和1来控制灯的亮灭,另一种是通过发送字符串来控制。 我所使用的开发板主控芯片是STM32F401RET6,主频84MHz, 首先要进行串口的初始化: /* 函数功能:串口的初始化 函数名:Usart_Init 返回值:无 参数:u32 brr 备注: USART1_TXD->PA9 USART1_RXD->PA10 */ void Usart_Init(u32 brr) { float div; u16 div

博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

basler运用pylon开发步骤

1、首先需要初始化Pylon,即调用PylonInitialize(); 2、在一个try{} catch(){}语句中进行打开相机的相关操作。 3、调用相机的传输层工厂类定义一个工厂类的引用,并初始化它,也就是CTlFactory& tlFactory = CTlFactory::GetInstance(); 4、得到所有连接的pylon相机,DeviceInfoList_t devic...

weixin_44840658的博客 8700

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 工业相机编程模型和流程
下一篇: 12.PMAC上位机-中断通信(下位机通知上位机)
cocoasprite
博客等级 码龄14年 72粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值