本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景
更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员,希望了解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 目录结构
2 QVirtualCamera
// 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();
};
// 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 设置
常规输出目录
$(SolutionDir)QPlugin\$(Configuration)\
配置类型
静态库(.lib)
浏览信息 生成后事件
xcopy /Y /I "QVirtualCamera.h" "$(SolutionDir)QPlugin\$(Configuration)\include\"
说明
具体目录自行决定,debug目录和release注意区分
3 QVirtualCameraTest
#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);
};
#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++ 常规 附加包含目录
\QVirtualClass\QPlugin\Debug\
连接器 常规 附加库目录
QVirtualClass\QPlugin\Debug;
连接器 输入
QVirtualCamera.lib;
说明
具体目录自行决定,debug目录和release注意区分