QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景

更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员,希望了解2D、3D相机视觉相关操作原理、已经出现问题快速排查、快速解决现场难题,推荐阅读本系列文章

同时也适合新手入门,或者想深入研究、正在接触该类型项目开发的开发者研究的阅读文章

视觉软件中从: 1.工业场景的相机选型 2: 相机SDK的模拟开发 各种模式设置、内部回调、返回图像、内部SDK编写、各种各类的SDK接口实现 3. 工业视觉软件的界面设计,ui的各种使用方法、SDK集成、多线程处理、buffer图像缓存处理、图像不同的处理显示、每个过程均会详细介绍实现 4. opencv 图像处理的各个过程

文章说明: 本系列分为两个部分

  1. 各种相机的介绍、原理操作、适宜的场景

  2. 相机SDK开发、编写SDK、工业软件、相关技术文章

有不足的地方请留言会改进,本系列文章预计不低于30篇 预计半年之内完结

使用到相关技术 会引入博主发布的技术文章,方便学习 真正做到 浅入深出,通俗易懂 高效 的学会相关技术短暂会使用虚拟SDK、接口来进行发布文章 编写界面,后续会在海康、大恒中间选择一款

++版权声明:本文禁止转载、复制二次发布,仅供付费读者研究++

++有相关问题请联系 Dream.2017@qq.com++ 官方网站 www.dreambegins.vip

QT 机器视觉 (3. 虚拟相机SDK、测试工具)目录

[1 目录结构](#1 目录结构)

[2 QVirtualCamera](#2 QVirtualCamera)

[2.1 设置](#2.1 设置)

[3 QVirtualCameraTest](#3 QVirtualCameraTest)

[2.1 设置](#2.1 设置)

[3 运行效果](#3 运行效果)

[4 其它文章](#4 其它文章)


本章实现了

1 目录结构

2 QVirtualCamera

cpp 复制代码
// QVirtualCamera.h
#pragma once

#include <QtCore/qglobal.h>
#include <functional>
#include <thread>
#include <chrono>
#include <cstdlib>
#include <mutex>

#ifndef BUILD_STATIC
# if defined(QVIRTUALCAMERA_LIB)
#  define QVIRTUALCAMERA_EXPORT Q_DECL_EXPORT
# else
#  define QVIRTUALCAMERA_EXPORT Q_DECL_IMPORT
# endif
#else
# define QVIRTUALCAMERA_EXPORT
#endif

// 图像数据回调类型
typedef std::function<void(const unsigned char* data, int width, int height)> ImageCallback;

class QVirtualCamera 
{
public:
	QVirtualCamera();

	static ImageCallback g_imageCallback; // 静态成员变量
	static bool g_running;                 // 静态成员变量
	static std::mutex g_mutex;            // 互斥量

	// 模拟图像数据生成
	void GenerateImageData(unsigned char* data, int width, int height);

	void RegisterImageCallback(ImageCallback callback);
	void StartCamera();
	void StopCamera();
};
cpp 复制代码
// QVirtualCamera.cpp
#include "QVirtualCamera.h"

bool QVirtualCamera::g_running = false; // 静态成员初始化
ImageCallback QVirtualCamera::g_imageCallback; // 静态成员初始化
std::mutex QVirtualCamera::g_mutex; // 互斥量初始化

QVirtualCamera::QVirtualCamera()
{
	srand(static_cast<unsigned int>(time(0))); // 初始化随机数种子
}

// 模拟图像数据生成
void QVirtualCamera::GenerateImageData(unsigned char* data, int width, int height)
{
	for (int i = 0; i < width * height * 3; ++i) 
	{
		data[i] = static_cast<unsigned char>(rand() % 256); // 随机生成图像数据
	}
}

// 启动虚拟相机
void QVirtualCamera::StartCamera()
{
	g_running = true;
	std::thread([=]() {
		const int width = 640;
		const int height = 480;
		unsigned char* imageData = new unsigned char[width * height * 3]; // RGB图像数据

		while (g_running) {
			GenerateImageData(imageData, width, height); // 生成图像数据

			// 使用互斥量保护回调函数的访问
			{
				std::lock_guard<std::mutex> lock(g_mutex);
				if (g_imageCallback) {
					g_imageCallback(imageData, width, height); // 调用回调函数
				}
			}

			std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟帧率
		}

		delete[] imageData; // 清理内存
	}).detach();
}

// 停止虚拟相机
void QVirtualCamera::StopCamera() 
{
	g_running = false;
}

// 注册图像回调
void QVirtualCamera::RegisterImageCallback(ImageCallback callback) 
{
	std::lock_guard<std::mutex> lock(g_mutex); // 使用互斥量保护
	g_imageCallback = callback;
}

2.1 设置

常规输出目录

cpp 复制代码
$(SolutionDir)QPlugin\$(Configuration)\

配置类型

cpp 复制代码
静态库(.lib)

浏览信息 生成后事件

cpp 复制代码
   xcopy /Y /I "QVirtualCamera.h" "$(SolutionDir)QPlugin\$(Configuration)\include\"

说明

具体目录自行决定,debug目录和release注意区分

3 QVirtualCameraTest

cpp 复制代码
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QVirtualCameraTest.h"
#include <iostream>
#include <Windows.h>

#include <QDebug>
#include "QVirtualCamera.h"

class QVirtualCameraTest : public QMainWindow
{
    Q_OBJECT

public:
    QVirtualCameraTest(QWidget *parent = nullptr);
    ~QVirtualCameraTest();

private:
    Ui::QVirtualCameraTestClass ui;

	QVirtualCamera* mpCamera;
	void OnInDialog();
	static void ImageReceived(const unsigned char* data, int width, int height);
};
cpp 复制代码
#include "QVirtualCameraTest.h"

QVirtualCameraTest::QVirtualCameraTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	OnInDialog();
}

QVirtualCameraTest::~QVirtualCameraTest()
{

}



void QVirtualCameraTest::ImageReceived(const unsigned char* data, int width, int height)
{
	QDateTime currentDateTime = QDateTime::currentDateTime();
	qDebug() << currentDateTime.toString() << "Received image of size: " << width << "x" << height ;
	// 处理图像数据
}


void QVirtualCameraTest::OnInDialog()
{
	mpCamera = new QVirtualCamera;

	// 注册回调
	mpCamera->RegisterImageCallback(ImageReceived);
	// 启动虚拟相机
	mpCamera->StartCamera();

	// 模拟运行一段时间
	//std::this_thread::sleep_for(std::chrono::seconds(10000));

	 停止虚拟相机
	//mpCamera->StopCamera();


}

2.1 设置

C/C++ 常规 附加包含目录

cpp 复制代码
\QVirtualClass\QPlugin\Debug\

连接器 常规 附加库目录

cpp 复制代码
QVirtualClass\QPlugin\Debug;

连接器 输入

cpp 复制代码
QVirtualCamera.lib;

说明

具体目录自行决定,debug目录和release注意区分

3 运行效果

4 其它文章

QT 机器视觉 1.相机类型-CSDN博客

QT 机器视觉 2.应用场景详解-CSDN博客

相关推荐
百流11 分钟前
Pyspark中pyspark.sql.functions常用方法(4)
1024程序员节
qq210846295314 分钟前
【Ubuntu】Ubuntu22双网卡指定网关
1024程序员节
YueTann32 分钟前
APS开源源码解读: 排程工具 optaplanner II
1024程序员节
kinlon.liu40 分钟前
安全日志记录的重要性
服务器·网络·安全·安全架构·1024程序员节
爱编程— 的小李1 小时前
开关灯问题(c语言)
c语言·算法·1024程序员节
是程序喵呀1 小时前
Uni-App-02
uni-app·vue·1024程序员节
A_aspectJ2 小时前
Spring 框架中都用到了哪些设计模式?
spring·设计模式·1024程序员节
20岁30年经验的码农2 小时前
爬虫基础
1024程序员节