Halcon联合QT ROI绘制
文章目录
- Halcon 操纵界面代码
- 窗口代码
Halcon 操纵界面代码
#pragma once#include <QLabel>#include <halconcpp/HalconCpp.h>
#include <qtimer.h>
#include <qevent.h>
using namespace HalconCpp;#pragma execution_character_set("utf-8")class CHalconLabel : public QLabel
{Q_OBJECTpublic:CHalconLabel(QWidget* parent);~CHalconLabel();protected:void resizeEvent(QResizeEvent* ev); //显示界面---尺寸更改事件void wheelEvent(QWheelEvent* ev); //显示界面---鼠标滚轮缩放事件void mousePressEvent(QMouseEvent* ev); //显示界面---鼠标按下事件void mouseReleaseEvent(QMouseEvent* ev); //显示界面---鼠标释放事件void mouseMoveEvent(QMouseEvent* ev); //显示界面---鼠标移动事件(有三种情况)//获取ROI区域public:void SetID(); //设置ID与显示窗口void SetPixelTracke(bool); //开启/关闭实时获取图像像素坐标下的灰度值void DisplayImage(HObject hDisplayImage); //显示图像(只显示图像)void ResetDisplayImage(); //恢复显示(只显示图像)void DrawCircles(); //绘制圆void DrawRectangles(); //绘制矩形void DrawRotateRectangles(); //绘制旋转矩形void DrawEllipses(); //绘制椭圆void ClearROI(); //清空所有的ROI区域void DispalyImageROI(); //显示图像(同时显示图像和ROI区域)void DisplayRegion(); //只显示ROI区域内的图像HObject GetRegion();private:HTuple m_hLabelID; //当前QLabel控件idHTuple m_hHalconID = NULL; //Halcon显示窗口idHObject m_drawnRegion; //绘图区域HObject ho_ImageZoom; //缩放的图像HObject hCurrentImage; //当前显示的图像HTuple m_tMouseDownRow, m_tMouseDownCol; //鼠标按下时的行列坐标bool m_bIsMove; //是否按下鼠标,未按下移动,实时获取坐标值,按下移动,移动显示图像bool m_bIsDrawROI; //绘制ROI区域时不再响应移动绘图事件HObject ho_Image;};
#include "CHalconLabel.h"CHalconLabel::CHalconLabel(QWidget* parent): QLabel(parent), m_bIsMove(false), m_bIsDrawROI(false)
{//初始化图像GenEmptyObj(&hCurrentImage);//初始化ROI区域GenEmptyObj(&m_drawnRegion);//设置文本位置---居中且上方,设置文本颜色this->setAlignment(Qt::AlignTop | Qt::AlignHCenter);this->setStyleSheet("color: red;");}CHalconLabel::~CHalconLabel()
{
}void CHalconLabel::resizeEvent(QResizeEvent * ev)
{if (m_hHalconID != NULL){//防止窗口闪烁SetSystem("flush_graphic", "false");//重新显示//显示二,维持原有图像比例且居中显示 ClearWindow(m_hHalconID);DetachBackgroundFromWindow(m_hHalconID);int labelWidth = this->width(); //窗口尺寸int labelHeight = this->height();HTuple imgWidth, imgHeight; //原图尺寸HTuple m_scaledWidth, m_scaledHeight; //缩放后的尺寸HTuple m_hvScaledRate; //缩放比例GetImageSize(hCurrentImage, &imgWidth, &imgHeight);//获取缩放系数TupleMin2(1.0 * labelWidth / imgWidth, 1.0 * labelHeight / imgHeight, &m_hvScaledRate);//进行图像缩放ZoomImageFactor(hCurrentImage, &ho_ImageZoom, m_hvScaledRate, m_hvScaledRate, "constant");GetImageSize(ho_ImageZoom, &m_scaledWidth, &m_scaledHeight);if (1.0 * labelWidth / imgWidth < 1.0 * labelHeight / imgHeight){SetWindowExtents(m_hHalconID, labelHeight / 2.0 - m_scaledHeight / 2.0, 0, labelWidth, m_scaledHeight);}else{SetWindowExtents(m_hHalconID, 0, labelWidth / 2.0 - m_scaledWidth / 2.0, m_scaledWidth, labelHeight);}SetPart(m_hHalconID, 0, 0, imgHeight - 1, imgWidth - 1);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);SetSystem("flush_graphic", "true");DetachBackgroundFromWindow(m_hHalconID);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);DispObj(hCurrentImage, m_hHalconID);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);DispObj(m_drawnRegion, m_hHalconID); // 添加此行以重新显示ROI}
}void CHalconLabel::wheelEvent(QWheelEvent* ev)
{double Zoom; //放大或缩小倍率HTuple mouseRow, mouseCol, Button;HTuple startRowBf, startColBf, endRowBf, endColBf, Ht, Wt, startRowAft, startColAft, endRowAft, endColAft;//滚轮前滑,放大if (ev->delta() > 0){Zoom = 2.0;//单步放大倍率}else//否则缩小{Zoom = 1 / 2.0;}//获取光标在原图上的位置,注意是原图坐标,不是Label下的坐标HTuple hv_Exception, hv_ErrMsg;try{GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);}catch (HException& HDevExpDefaultException){return;}//获取原图显示的部分,注意也是原图坐标GetPart(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf);//缩放前显示的图像宽高Ht = endRowBf - startRowBf;Wt = endColBf - startColBf;//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃if (Ht * Wt < 20000 * 20000 || Zoom == 2.0){//计算缩放后的图像区域startRowAft = mouseRow - ((mouseRow - startRowBf) / Zoom);startColAft = mouseCol - ((mouseCol - startColBf) / Zoom);endRowAft = startRowAft + (Ht / Zoom);endColAft = startColAft + (Wt / Zoom);//如果放大过大,则返回if (endRowAft - startRowAft < 2){return;}if (m_hHalconID != NULL){//如果有图像,则先清空图像DetachBackgroundFromWindow(m_hHalconID);}SetPart(m_hHalconID, startRowAft, startColAft, endRowAft, endColAft);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);}AttachBackgroundToWindow(hCurrentImage, m_hHalconID);DispObj(m_drawnRegion, m_hHalconID); // 添加此行以重新显示ROI
}void CHalconLabel::mousePressEvent(QMouseEvent* ev)
{HTuple mouseRow, mouseCol, Button;try{GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);}catch (HException){return;}//鼠标按下时的行列坐标m_tMouseDownRow = mouseRow;m_tMouseDownCol = mouseCol;m_bIsMove = true;
}void CHalconLabel::mouseReleaseEvent(QMouseEvent* ev)
{m_bIsMove = false;}void CHalconLabel::mouseMoveEvent(QMouseEvent* ev)
{//情况一:鼠标绘制ROI区域时,不响应鼠标移动事件if (m_bIsDrawROI) {this->setCursor(Qt::ArrowCursor); //指针设置为普通类型return;}//情况二:鼠标按下并移动时,只移动图像HTuple startRowBf, startColBf, endRowBf, endColBf, mouseRow, mouseCol, Button;try{SetCheck("~give_error"); //不要报错GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);if (mouseCol.Length() <= 0 || mouseRow.Length() < 0){return;}SetCheck("give_error");//在绘图显示界面上显示坐标//this->setText(QString("X坐标:%1 Y坐标:%2 ").arg(mouseCol[0].D()).arg(mouseRow[0].D()));}catch (HException){return;}if (m_bIsMove){this->setCursor(Qt::PointingHandCursor); //设置鼠标样式为手型指针//计算移动值double RowMove = mouseRow[0].D() - m_tMouseDownRow[0].D();double ColMove = mouseCol[0].D() - m_tMouseDownCol[0].D();//得到当前的窗口坐标GetPart(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf);//移动图像if (m_hHalconID != NULL){//如果有图像,则先清空图像DetachBackgroundFromWindow(m_hHalconID);}SetPart(m_hHalconID, startRowBf - RowMove, startColBf - ColMove, endRowBf - RowMove, endColBf - ColMove);SetCheck("~give_error");AttachBackgroundToWindow(hCurrentImage, m_hHalconID);//当光标不在Halcon窗口内时返回,否则会报错SetCheck("give_error");}//情况三:鼠标未按下移动时,实时获取当前图像坐标else {this->setCursor(Qt::ArrowCursor); //指针设置为普通类型HTuple pointGray;try{SetCheck("~give_error"); //不要报错GetGrayval(hCurrentImage, mouseRow, mouseCol, &pointGray);//当光标不在Halcon窗口内时返回,否则会报错if (mouseCol.Length() <= 0 || pointGray[0].D() < 0){return;}SetCheck("give_error"); //不要报错}catch (HException){// 设置文本的颜色为红色// this->setText(QString("X坐标:- Y坐标:- 灰度值:-"));return;}//在绘图显示界面上显示坐标//this->setText(QString("X坐标:%1 Y坐标:%2 灰度值:%3").arg(mouseCol[0].D()).arg(mouseRow[0].D()).arg(pointGray[0].D()));}AttachBackgroundToWindow(hCurrentImage, m_hHalconID);DispObj(m_drawnRegion, m_hHalconID); // 添加此行以重新显示ROI
}void CHalconLabel::DrawCircles()
{//绘制的过程中,不能鼠标移动图像,不响应鼠标移动事件m_bIsDrawROI = true;HObject currentRegion;HTuple Row, Column, Radius;DrawCircle(m_hHalconID, &Row, &Column, &Radius);GenCircle(¤tRegion, Row, Column, Radius);Union2(m_drawnRegion, currentRegion, &m_drawnRegion);//设置ROI边缘线SetColor(m_hHalconID, "red");SetDraw(m_hHalconID, "margin");SetLineWidth(m_hHalconID, 2);DispObj(m_drawnRegion, m_hHalconID);//绘制结束以后,实时获取当前图像的像素坐标m_bIsDrawROI = false;
}void CHalconLabel::DrawRectangles()
{m_bIsDrawROI = true;HObject currentRegion;HTuple R1, C1, R2, C2;DrawRectangle1(m_hHalconID, &R1, &C1, &R2, &C2);GenRectangle1(¤tRegion, R1, C1, R2, C2);Union2(m_drawnRegion, currentRegion, &m_drawnRegion);//设置ROI边缘线SetColor(m_hHalconID, "red");SetDraw(m_hHalconID, "margin");SetLineWidth(m_hHalconID, 2);DispObj(m_drawnRegion, m_hHalconID);m_bIsDrawROI = false;
}void CHalconLabel::DrawRotateRectangles()
{m_bIsDrawROI = true;HObject currentRegion;HTuple Row, Column, Phi, Length1, Length2;DrawRectangle2(m_hHalconID, &Row, &Column, &Phi, &Length1, &Length2);GenRectangle2(¤tRegion, Row, Column, Phi, Length1, Length2);Union2(m_drawnRegion, currentRegion, &m_drawnRegion);//设置ROI边缘线SetColor(m_hHalconID, "red");SetDraw(m_hHalconID, "margin");SetLineWidth(m_hHalconID, 2);DispObj(m_drawnRegion, m_hHalconID);m_bIsDrawROI = false;
}void CHalconLabel::DrawEllipses()
{m_bIsDrawROI = true;HObject currentRegion;HTuple Row, Column, Phi, Radius1, Radius2;DrawEllipse(m_hHalconID, &Row, &Column, &Phi, &Radius1, &Radius2);GenEllipse(¤tRegion, Row, Column, Phi, Radius1, Radius2);Union2(m_drawnRegion, currentRegion, &m_drawnRegion);//设置ROI边缘线SetColor(m_hHalconID, "red");SetDraw(m_hHalconID, "margin");SetLineWidth(m_hHalconID, 2);DispObj(m_drawnRegion, m_hHalconID);m_bIsDrawROI = false;
}void CHalconLabel::ClearROI()
{//直接清空GenEmptyRegion(&m_drawnRegion);
}void CHalconLabel::DispalyImageROI()
{DisplayImage(hCurrentImage);HObject emptyRegion;HTuple isEqual;GenEmptyRegion(&emptyRegion);TestEqualRegion(emptyRegion, m_drawnRegion, &isEqual);if (isEqual == 0) {DispObj(m_drawnRegion, m_hHalconID);}
}void CHalconLabel::DisplayRegion()
{HObject image;HObject emptyRegion;HTuple isEqual;GenEmptyRegion(&emptyRegion);TestEqualRegion(emptyRegion, m_drawnRegion, &isEqual);if (isEqual != 0) {return;}ReduceDomain(hCurrentImage, m_drawnRegion, &image);ClearWindow(m_hHalconID);DisplayImage(image);
}HObject CHalconLabel::GetRegion()
{return m_drawnRegion;
}void CHalconLabel::SetID()
{if (m_hHalconID == NULL) {SetWindowAttr("background_color", "black"); //设置背景色m_hLabelID = (Hlong)this->winId();OpenWindow(0, 0, this->width(), this->height(), m_hLabelID, "visible", "", &m_hHalconID);}
}void CHalconLabel::SetPixelTracke(bool ret)
{//设置鼠标追踪,可以实时响应鼠标移动事件this->setMouseTracking(ret);}void CHalconLabel::DisplayImage(HObject hDisplayImage)
{//隔离数据CopyImage(hDisplayImage, &hCurrentImage);//显示二,维持原有图像比例且居中显示 ClearWindow(m_hHalconID);DetachBackgroundFromWindow(m_hHalconID);int labelWidth = this->width(); //窗口尺寸int labelHeight = this->height();HTuple imgWidth, imgHeight; //原图尺寸HTuple m_scaledWidth, m_scaledHeight; //缩放后的尺寸HTuple m_hvScaledRate; //缩放比例GetImageSize(hCurrentImage, &imgWidth, &imgHeight);//获取缩放系数TupleMin2(1.0 * labelWidth / imgWidth, 1.0 * labelHeight / imgHeight, &m_hvScaledRate);//进行图像缩放ZoomImageFactor(hCurrentImage, &ho_ImageZoom, m_hvScaledRate, m_hvScaledRate, "constant");GetImageSize(ho_ImageZoom, &m_scaledWidth, &m_scaledHeight);if (1.0 * labelWidth / imgWidth < 1.0 * labelHeight / imgHeight){SetWindowExtents(m_hHalconID, labelHeight / 2.0 - m_scaledHeight / 2.0, 0, labelWidth, m_scaledHeight);}else{SetWindowExtents(m_hHalconID, 0, labelWidth / 2.0 - m_scaledWidth / 2.0, m_scaledWidth, labelHeight);}SetPart(m_hHalconID, 0, 0, imgHeight - 1, imgWidth - 1);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);}void CHalconLabel::ResetDisplayImage()
{ClearWindow(m_hHalconID);DetachBackgroundFromWindow(m_hHalconID);int labelWidth = this->width(); //窗口尺寸int labelHeight = this->height();HTuple imgWidth, imgHeight; //原图尺寸HTuple m_scaledWidth, m_scaledHeight; //缩放后的尺寸HTuple m_hvScaledRate; //缩放比例GetImageSize(hCurrentImage, &imgWidth, &imgHeight);//获取缩放系数TupleMin2(1.0 * labelWidth / imgWidth, 1.0 * labelHeight / imgHeight, &m_hvScaledRate);//进行图像缩放ZoomImageFactor(hCurrentImage, &ho_ImageZoom, m_hvScaledRate, m_hvScaledRate, "constant");GetImageSize(ho_ImageZoom, &m_scaledWidth, &m_scaledHeight);if (1.0 * labelWidth / imgWidth < 1.0 * labelHeight / imgHeight){SetWindowExtents(m_hHalconID, labelHeight / 2.0 - m_scaledHeight / 2.0, 0, labelWidth, m_scaledHeight);}else{SetWindowExtents(m_hHalconID, 0, labelWidth / 2.0 - m_scaledWidth / 2.0, m_scaledWidth, labelHeight);}SetPart(m_hHalconID, 0, 0, imgHeight - 1, imgWidth - 1);AttachBackgroundToWindow(hCurrentImage, m_hHalconID);
}
窗口代码
#pragma once#include <QtWidgets/QMainWindow>#include "CHalconLabel.h"#include "ui_HalconMain.h"
#include <qpushbutton.h>
#include <qfiledialog.h>class HalconMain : public QMainWindow
{Q_OBJECTpublic:HalconMain(QWidget *parent = nullptr);~HalconMain();public:void InitWidget();private slots:void on_readImageBtn();void on_drawCircleBtn();void on_drawRectangleBtn();void on_drawRotateBtn();void on_drawEllipseBtn();void on_clearROIBtn();void on_resetImageBtn();private:Ui::HalconMainClass ui;CHalconLabel* displayLabel;
};
HalconMain::HalconMain(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);InitWidget();//connect(ui.pb, &QPushButton::clicked, this, &HalconMain::on_readImageBtn);connect(ui.pb_readImg, &QPushButton::clicked, this, &HalconMain::on_readImageBtn);connect(ui.pb_drawcircle, &QPushButton::clicked, this, &HalconMain::on_drawCircleBtn);connect(ui.pb_drawrectangle, &QPushButton::clicked, this, &HalconMain::on_drawRectangleBtn);connect(ui.pb_clearroi, &QPushButton::clicked, this, &HalconMain::on_clearROIBtn);connect(ui.pb_recoverimg, &QPushButton::clicked, this, &HalconMain::on_resetImageBtn);}HalconMain::~HalconMain()
{
}void HalconMain::InitWidget()
{displayLabel = new CHalconLabel(this);ui.layout->addWidget(displayLabel);
}void HalconMain::on_drawCircleBtn()
{displayLabel->DrawCircles();
}void HalconMain::on_drawRectangleBtn()
{displayLabel->DrawRectangles();
}void HalconMain::on_drawRotateBtn()
{}void HalconMain::on_drawEllipseBtn()
{
}void HalconMain::on_clearROIBtn()
{displayLabel->ClearROI();displayLabel->DispalyImageROI();
}void HalconMain::on_resetImageBtn()
{displayLabel->DispalyImageROI();
}void HalconMain::on_readImageBtn()
{HObject hImage;displayLabel->SetID(); //最好不要在主界面的构造函数内调用这个函数QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));if (fileName.isEmpty()) {return;}//显示图像HTuple hFileName(fileName.toStdString().c_str());ReadImage(&hImage, hFileName);displayLabel->DisplayImage(hImage);displayLabel->SetPixelTracke(false);
}
相关文章:

Halcon联合QT ROI绘制
文章目录 Halcon 操纵界面代码窗口代码 Halcon 操纵界面代码 #pragma once#include <QLabel>#include <halconcpp/HalconCpp.h> #include <qtimer.h> #include <qevent.h> using namespace HalconCpp;#pragma execution_character_set("utf-8&qu…...

力扣面试150题--二叉树的右视图
Day 53 题目描述 思路 采取层序遍历,利用一个high的队列来保存每个节点的高度,highb和y记录上一个节点的高度和节点,在队列中,如果队列中顶部元素的高度大于上一个节点的高度,说明上一个节点就是上一层中最右边的元素…...
数据绑定页面的完整的原理、逻辑关系、实现路径是什么?页面、表格、字段、属性、值、按钮、事件、模型、脚本、服务编排、连接器等之间的关系又是什么?
目录 一、核心概念:什么是数据绑定页面? 二、涉及的组件及其逻辑关系 页面(Page): 表格(Table): 字段(Field): 属性(Property): 值(Value): 按钮(Button): 事件(Event): 模型(Model): 脚本(Script): 服务(Service): 服务编排(Se…...

江西某石灰石矿边坡自动化监测
1. 项目简介 该矿为露天矿山,开采矿种为水泥用石灰岩,许可生产规模200万t/a,矿区面积为1.2264km2,许可开采深度为422m~250m。矿区地形为东西一北东东向带状分布,北高南低,北部为由浅变质岩系组…...
《Python 应用中的蓝绿部署与滚动更新:持续集成中的实践与优化》
《Python 应用中的蓝绿部署与滚动更新:持续集成中的实践与优化》 引言 在现代软件开发中,持续集成与持续部署(CI/CD)已成为标准实践。面对频繁发布与升级需求,蓝绿部署和滚动更新两种策略为 Python 应用提供了稳定、安全的发布方式。本文将深入探讨这两种策略的原理、适…...

C# 类和继承(所有类都派生自object类)
所有类都派生自object类 除了特殊的类object,所有的类都是派生类,即使它们没有基类规格说明。类object是唯 一的非派生类,因为它是继承层次结构的基础。 没有基类规格说明的类隐式地直接派生自类object。不加基类规格说明只是指定object为 基…...

02业务流程的定义
1.要想用好业务流程,首先必须得了解流程与认识流程,什么是业务流程。在认识流程之前,首先要理清两个基本概念,业务和流程。 业务指的是:个人的或者摸个机构的专业工作。流程,原本指的是水的路程࿰…...

cursor rules设置:让cursor按执行步骤处理(分析需求和上下文、方案对比、确定方案、执行、总结)
写在前面的话: 直接在cursor rules中设置一下内容: RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 上下文与设置 核心思维原则 模式详解 模式1: RESEARCH…...

Linux操作系统之进程(四):命令行参数与环境变量
目录 前言: 什么是命令行参数 什么是环境变量 认识环境变量 PATH环境变量 HOME USER OLDPWD 本地变量 本地变量与环境变量的差异 核心要点回顾 结语: 前言: 大家好,今天给大家带来的是一个非常简单,但也十…...

Typora-macOS 风格代码块
效果: 替换 Typora安装目录中 themes 文件夹下的 base.user.css 文件,直接替换即可,建议先备份。 css: /* 语法高亮配色 */ .CodeMirror-line .cm-number { color: #b5cea8; } /* 数字 - 浅绿色 */ .CodeMirror-line .…...
如何迁移SOS数据库和修改sos服务的端口号
一. 迁移SOS数据库。 1. 对SOS整个库进行拷贝。压缩拷贝等都可以 2. 找到SOS安装目录下的这个目录 /SOS7/SERVERS7/LOCAL/ 在此目录下会发现,有SOS服务库的文件夹。拷贝你要迁移的SOS数据库 3. 进入该文件夹,找到:serverdb.cfg 打开后&…...

ansible自动化playbook简单实践
方法一:部分使用ansible 基于现有的nginx配置文件,定制部署nginx软件,将我们的知识进行整合 定制要求: 启动用户:nginx-test,uid是82,系统用户,不能登录 启动端口82 web项目根目录/…...

20250526惠普HP锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U)的显卡驱动下载
20250526惠普HP锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U)的显卡驱动下载 2025/5/26 14:44 百度:AMD 7700 显卡驱动 amd APU 显卡驱动 https://item.jd.com/100054819707.html 惠普HP【国家补贴20%】锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U 16G 1T…...
WIN11使用vscode搭建c语言开发环境
安装 VS Code 下载地址: Visual Studio Code - Code Editing. Redefined 安装时勾选 "添加到 PATH"(方便在终端中调用 code 命令 下载 MSYS2 官网:MSYS2 下载 msys2-x86_64-xxxx.exe(64位版本)并安装。 默认安装路径…...

2025年5月蓝桥杯stema省赛真题——象棋移动
上方题目可点下方去处,支持在线编程~ 象棋移动_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方,支持源码和素材获取~ 象棋移动-scratch作品-少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级…...

AI重构SEO关键词精准定位
内容概要 随着AI技术深度渗透数字营销领域,传统SEO关键词定位模式正经历系统性重构。基于自然语言处理(NLP)的智能语义分析引擎,可突破传统关键词工具的局限性,通过解析长尾搜索词中的隐含意图与语境关联,…...
C++ 模板元编程语法大全
C 模板元编程语法大全 模板元编程(Template Metaprogramming, TMP)是C中利用模板在编译期进行计算和代码生成的强大技术。以下是C模板元编程的核心语法和概念总结: 1. 基础模板语法 类模板 template <typename T> class MyClass {// 类定义 };函数模板 t…...

SPSS跨域分类:自监督知识+软模板优化
1. 图1:SPSS方法流程图 作用:展示了SPSS方法的整体流程,从数据预处理到模型预测的关键步骤。核心内容: 领域知识提取:使用三种词性标注工具(NLTK、spaCy、TextBlob)从源域和目标域提取名词或形容词(如例句中提取“excellent”“good”等形容词)。词汇交集与聚类:对提…...
【术语扫盲】BSP与MSP
专业解释版: MSP(Microcontroller Support Package) 定义:MSP 是微控制器支持包,包含 MCU 的启动代码、寄存器配置、驱动库等,主要针对 芯片本身。 作用:提供通用的底层硬件抽象,方…...

vscode的Embedded IDE创建keil项目找不到源函数或者无法跳转
创建完Embedded IDE项目后跳转索引很容易找不到源函数或者无法跳转,原因是vscode工作区被eide覆盖了,需要手动往当前目录下的.vscode/c_cpp_properties.json里添加路径 打开eide.json ,找到folders, 里面的name是keil里工程的虚拟…...
HTTP/2与HTTP/3特性详解:为你的Nginx/Apache服务器开启下一代Web协议
更多服务器知识,尽在hostol.com 嘿,各位站长和服务器管理员朋友们!咱们天天跟网站打交道,都希望自己的网站能像火箭一样快,用户体验“嗖嗖”的。但你知道吗?除了服务器硬件配置、代码优化、CDN加速这些“常…...

构建高效智能客服系统的8大体验设计要点
构建一流的客户服务中心体验,企业需要以用户需求为核心,将智能化流程、前沿科技与人文关怀有机结合,打造流畅、高效且富有温度的服务生态。在客户需求日益多元化的今天,单纯的问题解决能力已无法满足期待,关键在于通过…...

CppCon 2014 学习:Making C++ Code Beautiful
你说的完全正确,也很好地总结了 C 这门语言在社区中的两种典型看法: C 的优点(Praise) 优点含义Powerful允许底层控制、系统编程、高性能计算、模板元编程、并发等多种用途Fast无运行时开销,接近汇编级别性能&#x…...
副本(Replica)在Elasticsearch中扮演什么角色?
在Elasticsearch(ES)中,副本(Replica)是主分片(Primary Shard)的镜像拷贝,与主分片共同构成分布式索引的高可用性和高性能架构。副本的设计目标是解决数据冗余、负载均衡和故障恢复等核心问题,其具体作用和原理如下: 一、副本的核心角色与功能 1. 数据冗余与故障恢…...

据传苹果将在WWDC上发布iOS 26 而不是iOS 19
苹果可能会对其操作系统的编号方式做出重大改变,基于年份的新版系统会将iOS 19重新命名为 iOS 26,同时 macOS 也会以同样的方式命名。 苹果的编号系统相当简单,版本号每年都会像钟表一样定期更新。然而,今年秋天情况可能有所不同&…...
整理了Windows(7—11)官方镜像下载链接和各版本区别介绍
原文《整理了Windows(7—11)官方镜像下载链接和各版本区别介绍》 引言 在安装或重装Windows系统时,使用微软官网提供的正版ISO镜像可以保证系统完整性和安全更新,避免使用第三方盗版镜像带来的恶意软件、广告风险。 本期汇总了微…...
数据库主键与索引详解
目录 主键核心特性 主键必要性问题 索引核心解析 基本定义 优劣分析 索引类型对比 数据结构实现 工作原理 主键与索引核心区别 主键核心特性 唯一标识:确保字段数据不重复且不为空数量限制:每表仅允许存在一个主键存储类型:通常采用…...
RTOS:启动调度器的作用(含源码逐行解读)
文章目录 前言一、启动调度器二、详细逻辑分析三、逐行分析3.1、traceENTER_vTaskStartScheduler3.2、configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) > configNUMBER_OF_CORES );3.3、xReturn prvCreateIdleTasks();3.4、xTimerCreateTimerTask();3.5、fre…...
【Python 进阶】抽象基类(Abstract Base Class)
abc 模块和抽象基类(Abstract Base Class)的概念: 本文的示例代码来源于 break-a-scene. abc 是 Python 标准库中的一个模块,全称是 “Abstract Base Classes”(抽象基类)。它提供了一种定义抽象类和抽象方法的机制。在以下代码…...
Armv7l或树莓派32位RPI 4B编译faiss
pip3 install faiss-cpu当然找不到预编译的包 手动下载 git clone https://github.com/facebookresearch/faiss.git cd faiss #能需要切换到特定版本标签,例如 v1.7.1,这个版本Cmake 3.18可以过,因为apt install安装的cmake只更新到这里&am…...