Files
RCiRoot e3f7733316 V20260829-2.6.1
完成框架目录和模块重构;新增核心、单例、工具、加密及框架 SDK;统一任务、相机和 RPC 接口,并增加离线检测、相机标定、备份恢复、版本管理、崩溃守护和心跳监控功能。
2026-09-20 16:01:09 +08:00

124 lines
4.5 KiB
C++

#pragma once
#include <eui_tools/export.h>
#include <windows.h>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include <opencv.hpp>
#include <qmutex.h>
EUI_TOOLS_API void Cross(cv::Mat& image, const cv::Point& center, int length,
int thickness, const cv::Scalar& color = cv::Scalar(255, 255, 255));
EUI_TOOLS_API void drawArrow(cv::Mat& paint, const cv::Point& start, const int& length,
const bool& horizontal, const cv::Scalar& color, const int& thickness, const int& arrowSize);
EUI_TOOLS_API void drawRotatedRect(cv::Mat& image, cv::RotatedRect rotatedRect,
cv::Scalar color, int thickness, int lineType);
EUI_TOOLS_API std::wstring utf8ToWstring(const std::string& utf8Str);
EUI_TOOLS_API void putTextZH(cv::Mat& image, const std::string& text, cv::Point org,
int fontSize = 20, cv::Scalar color = cv::Scalar(255, 0, 0));
class TextRendererBase
{
public:
virtual ~TextRendererBase() = default;
virtual void putText(cv::Mat& image, const std::string& text, cv::Point org,
cv::Scalar color = cv::Scalar(255, 0, 0)) = 0;
};
class EUI_TOOLS_API TextRendererZH
{
public:
TextRendererZH(const TextRendererZH&) = delete;
TextRendererZH& operator=(const TextRendererZH&) = delete;
// 持有裸 GDI 句柄且含 QMutex,禁止移动(原先的 = default 实际也是 deleted,这里改为显式)
TextRendererZH(TextRendererZH&&) = delete;
TextRendererZH& operator=(TextRendererZH&&) = delete;
TextRendererZH(int width, int height, int fontSize = 20,
const std::wstring& fontName = L"Microsoft YaHei");
~TextRendererZH();
void putText(cv::Mat& image, const std::string& text, cv::Point org,
cv::Scalar color = cv::Scalar(255, 0, 0));
void resize(int width, int height);
void setFontSize(int fontSize);
private:
void resize_unsafe(int width, int height);
static void logMessage(const char* message);
void createResources();
void releaseResources();
static std::wstring utf8ToWstring(const std::string& str);
int width_;
int height_;
int fontSize_;
std::wstring fontName_;
HDC screenDC_ = nullptr;
HDC memDC_ = nullptr;
HBITMAP hBitmap_ = nullptr;
void* pBits_ = nullptr;
BITMAPINFO bmi_{};
HFONT hFont_ = nullptr;
HGDIOBJ oldBitmap_ = nullptr;
HGDIOBJ oldFont_ = nullptr;
QMutex mutex_;
};
class EUI_TOOLS_API cvPainter
{
public:
explicit cvPainter(const int& fontSize = 50);
cvPainter(const cvPainter&) = delete;
cvPainter& operator=(const cvPainter&) = delete;
cvPainter(cvPainter&&) = delete;
cvPainter& operator=(cvPainter&&) = delete;
~cvPainter() = default;
struct pointPaintJob { cv::Point center; cv::Scalar color; };
struct contourPaintJob {
std::vector<std::vector<cv::Point>> contour;
int i;
cv::Scalar color;
int thickness;
int lineType = cv::LINE_8;
cv::Mat hierarchy;
int maxLevel = INT_MAX;
cv::Point offset;
};
struct linePaintJob { cv::Point p1; cv::Point p2; cv::Scalar color; int thickness; };
struct circleAndCrossPaintJob { cv::Point center; int radius; cv::Scalar color; int thickness; int type; };
struct rectPaintJob { cv::Rect rect; cv::Scalar color; int thickness; };
struct textPaintJob { std::string text; cv::Point p; cv::Scalar color; int fontSize; };
void clearPaintJobs();
void appendPaintJob(cv::Point center, cv::Scalar color);
void appendPaintJob(std::vector<std::vector<cv::Point>> contour, int i,
cv::Scalar color, int thickness, int lineType = cv::LINE_8,
cv::InputArray hierarchy = cv::noArray(), int maxLevel = INT_MAX,
cv::Point offset = cv::Point());
void appendPaintJob(cv::Point p1, cv::Point p2, cv::Scalar color, int thickness);
void appendPaintJob(cv::Point center, int radius, cv::Scalar color, int thickness, int type);
void appendPaintJob(cv::Rect rect, cv::Scalar color, int thickness);
void appendPaintJob(const std::string& text, cv::Point p, cv::Scalar color, int fontSize = -1);
void executePaintJobs(cv::Mat& image);
private:
static void logMessage(const char* message);
int defaultFontSize = 50;
std::vector<textPaintJob> textPaintJobs;
std::vector<pointPaintJob> pointPaintJobs;
std::vector<circleAndCrossPaintJob> circleAndCrossPaintJobs;
std::vector<linePaintJob> linePaintJobs;
std::vector<contourPaintJob> contourPaintJobs;
std::vector<rectPaintJob> rectPaintJobs;
std::unordered_map<int, std::unique_ptr<TextRendererZH>> textRenderers_;
mutable QMutex mutex_;
};