Halcon联合QT ROI绘制

news2025/6/2 2:33:23

文章目录

  • 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_OBJECT

public:
	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控件id
	HTuple   m_hHalconID = NULL;				//Halcon显示窗口id
	HObject  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(&currentRegion, 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(&currentRegion, 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(&currentRegion, 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(&currentRegion, 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_OBJECT

public:
    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);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣面试150题--二叉树的右视图

Day 53 题目描述 思路 采取层序遍历&#xff0c;利用一个high的队列来保存每个节点的高度&#xff0c;highb和y记录上一个节点的高度和节点&#xff0c;在队列中&#xff0c;如果队列中顶部元素的高度大于上一个节点的高度&#xff0c;说明上一个节点就是上一层中最右边的元素…

江西某石灰石矿边坡自动化监测

1. 项目简介 该矿为露天矿山&#xff0c;开采矿种为水泥用石灰岩&#xff0c;许可生产规模200万t/a&#xff0c;矿区面积为1.2264km2&#xff0c;许可开采深度为422m&#xff5e;250m。矿区地形为东西一北东东向带状分布&#xff0c;北高南低&#xff0c;北部为由浅变质岩系组…

C# 类和继承(所有类都派生自object类)

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

02业务流程的定义

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

cursor rules设置:让cursor按执行步骤处理(分析需求和上下文、方案对比、确定方案、执行、总结)

写在前面的话&#xff1a; 直接在cursor rules中设置一下内容&#xff1a; RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 RIPER-5 MULTIDIMENSIONAL THINKING AGENT EXECUTION PROTOCOL 目录 上下文与设置 核心思维原则 模式详解 模式1: RESEARCH…

Linux操作系统之进程(四):命令行参数与环境变量

目录 前言&#xff1a; 什么是命令行参数 什么是环境变量 认识环境变量 PATH环境变量 HOME USER OLDPWD 本地变量 本地变量与环境变量的差异 核心要点回顾 结语&#xff1a; 前言&#xff1a; 大家好&#xff0c;今天给大家带来的是一个非常简单&#xff0c;但也十…

Typora-macOS 风格代码块

效果&#xff1a; 替换 Typora安装目录中 themes 文件夹下的 base.user.css 文件&#xff0c;直接替换即可&#xff0c;建议先备份。 css&#xff1a; /* 语法高亮配色 */ .CodeMirror-line .cm-number { color: #b5cea8; } /* 数字 - 浅绿色 */ .CodeMirror-line .…

ansible自动化playbook简单实践

方法一&#xff1a;部分使用ansible 基于现有的nginx配置文件&#xff0c;定制部署nginx软件&#xff0c;将我们的知识进行整合 定制要求&#xff1a; 启动用户&#xff1a;nginx-test&#xff0c;uid是82&#xff0c;系统用户&#xff0c;不能登录 启动端口82 web项目根目录/…

20250526惠普HP锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U)的显卡驱动下载

20250526惠普HP锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U)的显卡驱动下载 2025/5/26 14:44 百度&#xff1a;AMD 7700 显卡驱动 amd APU 显卡驱动 https://item.jd.com/100054819707.html 惠普HP【国家补贴20%】锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U 16G 1T…

2025年5月蓝桥杯stema省赛真题——象棋移动

上方题目可点下方去处&#xff0c;支持在线编程&#xff5e; 象棋移动_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方&#xff0c;支持源码和素材获取&#xff5e; 象棋移动-scratch作品-少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级…

AI重构SEO关键词精准定位

内容概要 随着AI技术深度渗透数字营销领域&#xff0c;传统SEO关键词定位模式正经历系统性重构。基于自然语言处理&#xff08;NLP&#xff09;的智能语义分析引擎&#xff0c;可突破传统关键词工具的局限性&#xff0c;通过解析长尾搜索词中的隐含意图与语境关联&#xff0c;…

SPSS跨域分类:自监督知识+软模板优化

1. 图1:SPSS方法流程图 作用:展示了SPSS方法的整体流程,从数据预处理到模型预测的关键步骤。核心内容: 领域知识提取:使用三种词性标注工具(NLTK、spaCy、TextBlob)从源域和目标域提取名词或形容词(如例句中提取“excellent”“good”等形容词)。词汇交集与聚类:对提…

vscode的Embedded IDE创建keil项目找不到源函数或者无法跳转

创建完Embedded IDE项目后跳转索引很容易找不到源函数或者无法跳转&#xff0c;原因是vscode工作区被eide覆盖了&#xff0c;需要手动往当前目录下的.vscode/c_cpp_properties.json里添加路径 打开eide.json &#xff0c;找到folders&#xff0c; 里面的name是keil里工程的虚拟…

构建高效智能客服系统的8大体验设计要点

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

CppCon 2014 学习:Making C++ Code Beautiful

你说的完全正确&#xff0c;也很好地总结了 C 这门语言在社区中的两种典型看法&#xff1a; C 的优点&#xff08;Praise&#xff09; 优点含义Powerful允许底层控制、系统编程、高性能计算、模板元编程、并发等多种用途Fast无运行时开销&#xff0c;接近汇编级别性能&#x…

据传苹果将在WWDC上发布iOS 26 而不是iOS 19

苹果可能会对其操作系统的编号方式做出重大改变&#xff0c;基于年份的新版系统会将iOS 19重新命名为 iOS 26&#xff0c;同时 macOS 也会以同样的方式命名。 苹果的编号系统相当简单&#xff0c;版本号每年都会像钟表一样定期更新。然而&#xff0c;今年秋天情况可能有所不同&…

嵌入式开发STM32 -- 江协科技笔记

1.背景介绍及基础认知 8大输入输出 斯密特触发器&#xff1a;高于设定阈值输出高电平&#xff0c;低于设定阈值输出低电平 有关上拉输入、下拉输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及浮空输入、模拟输入的区别 1、上拉输入&#xff1a;上拉就是把电位拉高…

[网页五子棋][用户模块]客户端开发(登录功能和注册功能)

文章目录 客户端开发登录功能htmlcsscommon.csslogin.css jQuery引入 jquery 运行程序注册功能 客户端开发 登录功能 html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport&…

MQTT协议,EMQX部署,MQTTX安装学习

一、MQTT概述 1.什么是MQTT MQTT是一种基于“发布订阅“”模式的消息传输协议。 消息&#xff1a;设备和设备之间传输的数据&#xff0c;或者服务和服务之间要传输的数据。 协议&#xff1a;传输数据时所遵循的规范。 2.常见的通讯模式 &#xff08;1&#xff09;客户端-服…

60天python训练计划----day40

DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 一.单通道图…