【重明】机器视觉QT/C++实现工业相机二次开发框架

这篇具有很好参考价值的文章主要介绍了【重明】机器视觉QT/C++实现工业相机二次开发框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工业相机二次开发是机器视觉行业必不可少的技能之一。
而如何实现一个框架,能够兼容所有工业相机二次开发,从而支持多种类型的工业相机,就是机器视觉行业的进阶技能了。
【重明】机器视觉QT/C++实现工业相机二次开发框架,机器视觉项目,qt,c++,opencv,计算机视觉,机器视觉,图像处理,工业相机
重明工业相机二次开发项目就是在实现相机二开框架的基础上,完成了海康工业相机的二次开发。
项目源码下载地址:
https://www.roundvision.cc/softwaredevelopment/qt/chongming/
技术栈:
1、C++
2、 QT 5.14.2
3、Opencv 4.5.5
4、工业相机SDK二次开发
重明工业相机二次开发项目框架如下图所示:
【重明】机器视觉QT/C++实现工业相机二次开发框架,机器视觉项目,qt,c++,opencv,计算机视觉,机器视觉,图像处理,工业相机
整个项目分前端部分的界面设计,和后端部分的工业相机框架设计。

1、界面GUI实现

重明的界面实现非常简洁,主要为三个部分:
左侧的相机列表,中间的图像显示,右侧的相机参数属性列表。
【重明】机器视觉QT/C++实现工业相机二次开发框架,机器视觉项目,qt,c++,opencv,计算机视觉,机器视觉,图像处理,工业相机
控制窗口的实现非常简单,其实就是一排按钮加一个QListWidget列表,用来显示所有检测到的工业相机。
视觉窗口用来显示图像,采用QT的视图模型框架,采用QGrapicsScene来实现的。
属性窗口主要涉及到了QT的MVD框架,即Model-View-Delegate框架,模型-视图-代理,通过视图代理,完成了对各个不同属性参数类型的支持,完成了相机参数属性Int,double,bool,cmd,string等多种类型的显示。

2、后端框架接口

实现了前端界面,现在我们可以考虑,如何抽象工业相机接口类,实现对不同工业相机的无差别接入,达到工业相机二次开发框架的效果呢?
这里可以借用QT插件的便利性,来设计工业相机抽象插件接口:

 //相机接口类
class CameraInterface
{
public:
	CameraInterface(const CameraMetaInfo& info)
	{
		m_cameraInfo = info;
	}
	virtual ~CameraInterface() {}
	//获取相机用户定义名称
	virtual std::string UserName()
	{
		return m_cameraInfo.UserDefineID;
	}
	//获取相机序列号
	virtual std::string Serial()
	{
		return m_cameraInfo.Serial;
	}
	//获取相机参数列表
	virtual uint32_t getParamList(std::vector<CameraParam>& paramList) = 0;
	//判断相机是否连接
	virtual bool isConnect() = 0;
	//判断相机是否拉流
	virtual bool isGrabbing() = 0;
	//初始化相机对象
	virtual uint32_t acquire() = 0;
	//释放相机
	virtual uint32_t release() = 0;
	//连接相机
	virtual uint32_t connect() = 0;
	//断开连接
	virtual uint32_t disconnect() = 0;
	//创建拉流资源
	virtual uint32_t creatStream() = 0;
	//销毁拉流资源
	virtual uint32_t destroyStream() = 0;
	//开启拉流
	virtual uint32_t startGrabbing() = 0;
	//停止拉流
	virtual uint32_t stopGrabbing() = 0;
	//导入配置文件
	virtual uint32_t loadConfig(const std::string path) = 0;
	//导出配置文件
	virtual uint32_t saveConfig(const std::string path) = 0;
	//获取配置文件格式
	virtual std::string configFormat() = 0;
	//读取相机参数
	virtual uint32_t readParam(CameraParam& param) = 0;
	//写入相机参数
	virtual uint32_t writeParam(CameraParam& param) = 0;
	//获取实时图像
	virtual uint32_t getImageLast(cv::Mat& image) = 0;
	//获取图像队列
	virtual CameraImageQueue& ImageQueue()
	{
		return m_imageQueue;
	}

protected:
	CameraImageQueue m_imageQueue;//图像队列
	std::vector<CameraParam> m_cameraParams;//相机参数列表
	CameraMetaInfo m_cameraInfo;//相机元信息
};

通过抽象设计统一的相机行为接口,在通过层层封装,即可达到框架效果。

如何实现相机图像队列

相机出图速度是有差异的,而我们处理相机出图也会有所耗时,如果你是出一张图像处理一张,然后再去拿一张图像,那很容易造成丢帧的问题。所以设计一个缓冲队列是非常有必要的。

我们的图像队列内部会包含两个队列,一个空闲队列,一个工作队列。
在我们相机图像队列这个应用场景下,生产者就是相机SDK的回调函数,该回调函数会生成相机的原始图像数据,我们在回调函数内将原始图像数据加入到队列中。
加入到队列是先看空闲队列有没有位置,如果有则加入到空闲队列,然后触发信号量激活消费者。如果空闲队列没有位置,则从工作队列取出最旧的图像,将原始数据加入到该位置。
我们的消费者,就是我们的取图线程,我们软件会不停的从队列中的工作队列中尝试取出图像,当工作队列为空时,会阻塞在信号量中,当生产者生产了一张图像后,会激活该信号量使取图线程取到图像。
图像队列代码实现:


#define TIME_OUT_MS		5000	//取图超时时间
#define ImageQueueSize	10		//图像队列长度宏定义

class CameraImageQueue
{
public:
	CameraImageQueue();
	CameraImageQueue(int maxSize);
	//向图像队列中加入图像
	uint32_t Put(const cv::Mat& m);
	//从图像队列中取出图像
	uint32_t Take(cv::Mat& m);
	//队列是否为空
	bool Empty();
	//队列是否为满
	bool Full();
	//队列当前长度
	size_t Size();
private:
	bool isFull() const
	{
		bool full = workImageQueue.size() >= m_queueSize;
		return full;
	}

	bool isEmpty() const
	{
		bool empty = workImageQueue.empty();
		return empty;
	}

	bool NotFull() const
	{
		bool full = workImageQueue.size() >= m_queueSize;
		return !full;
	}

	bool NotEmpty() const
	{
		bool empty = workImageQueue.empty();
		return !empty;
	}

private:
	std::mutex m_mutex;
	std::condition_variable m_condition;
	std::queue<cv::Mat> freeImageQueue;//空闲队列
	std::queue<cv::Mat> workImageQueue;//工作队列

	uint8_t m_queueSize;
	bool m_needStop;
};

THE END

项目源码下载地址:
https://www.roundvision.cc/softwaredevelopment/qt/chongming/
项目由丰富的视频教程,见BiliBili:
【重明】机器视觉QT/C++实现工业相机二次开发框架,机器视觉项目,qt,c++,opencv,计算机视觉,机器视觉,图像处理,工业相机
视频链接:https://www.bilibili.com/video/BV1pp4y1n7X9文章来源地址https://www.toymoban.com/news/detail-785790.html

到了这里,关于【重明】机器视觉QT/C++实现工业相机二次开发框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器视觉工业相机和镜头选型

    1、倍率=芯片尺寸(靶面)/视野----远心镜头选择 2、焦距=倍率x相机高度(工作距离) 2、像素精度要求=检查精度/(3-5)个像素 3、相机分辨率=视野/像素精度 4、芯片尺寸(靶面)=像元尺寸*相机分辨率 案例一(尺寸测量) 1、要求: ①机台相对静止不抖动,可以安装背光源 ②

    2024年02月09日
    浏览(29)
  • 机器视觉_工业相机及相关配件选型

    凭我的经验,一般能带上工业两字的,和日常版最大的区别就是更稳定、抗干扰能力更强(高温、高压、防尘、防水、防爆、抗电磁干扰等;列举这么多,并不意味着必须带有这些功能,这些功能通常是可定制的),当然还有其他特点,比如接口可扩展、定制性比较强等。

    2024年02月13日
    浏览(36)
  • 机器视觉海康工业相机SDK参数设置获取

    视觉人机器视觉培训-缺陷检测项目-食品行业草鸡蛋外观检测 相机参数类型可分为六类,除 command 参数外,每一类都有其对应的设置与获取函数接口。 表 1 参数类型及对应函数接口介绍 *详细函数接口可参考 SDK 手册: ​C:Program Files (x86)MVSDevelopmentDocumentations 相机参数类型

    2024年02月07日
    浏览(71)
  • 机器视觉之Basler工业相机使用和配置方法(C++)

    basler工业相机做双目视觉用,出现很多问题记录一下: 首先是多看手册:https://zh.docs.baslerweb.com/software 手册内有所有的源码和参考示例,实际上在使用过程中,大部分都是这些源码,具体项目选择对应的示例代码。 可以通过balser的镜头选型工具,按照自己需要测量目标的距

    2024年02月07日
    浏览(29)
  • Linux下海康威视工业相机的SDK二次开发

    1.1安装包的下载和解压 去 官网 下载两个软件安装,分别是客户端和开发环境。 (这里我们下载V2.1.1(Linux)和Runtime组件包(Linux)): 工业相机文档/安装包中的不同安装版本安装包里有各个系统及arm开发板使用的安装包,选择相应的安装包进行安装 (这里我们选择最后一

    2024年02月09日
    浏览(28)
  • 基于halcon实现视觉定位框架(C#做主算法,C#、MFC、Qt二次开发)【附源码】

    本文主要实现halcon二次开发,基于C#做视觉算法的编辑,已C#做用户空间,然后使用C#、C++(MFC、Qt)分别实现调用,从而实现多相机的使用。 换句话说就是:C#做算法及主界面开发,然后把生成的控件dll移交给C#或者MFC或者QT进行二次调用实现二次开发,这里主要想展示的是多

    2024年01月19日
    浏览(67)
  • 基于康耐视cognexVisionpro用C#二次开发的多相机视觉对位框架

    基于康耐视cognexVisionpro用C#二次开发的多相机视觉对位框架 支持1:多相机对位逻辑运算,旋转标定坐标关联运算(可供参考学习)可以协助理解做对位贴合项目思路。 支持2:直接连接运动控制卡,控制UVW平台运动(可供参考学习) 支持3:自动标定程序设定(可供参考学习

    2024年04月15日
    浏览(27)
  • (一)Qt+OpenCV调用海康工业相机SDK示例开发

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 近期在Qt环境下进行海康工业相机的使用开发,发现海康提供的示例没有Qt的demo,而其中有基于MFC框架的示例,所以在这

    2024年02月03日
    浏览(49)
  • Dalsa线扫相机-二次开发-QT-C++ 可用Demo(一)

           Dalsa线扫描相机的二次开发,因为官方只有MFC和命令行版本的,我需要使用QT进行开发,于是自己花时间研究,然后写了一个,效果如下:         可能GIF动图有点模糊,在图片中,上面为实时画面,我使用的是4096*128分辨率,然后使用手机的闪光灯在相机旁边摇晃

    2024年02月05日
    浏览(70)
  • (二)Qt多线程实现海康工业相机图像实时采集

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 本文主要讲述了使用Qt多线程实现海康工业相机图像的采集,并在界面上将两个相机采集到的图像信息同时显示出来,在

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包