QT实现地图或图片的细节图(抓取图片的细节,放大图片)

2023-05-16

      最近由于项目上的要求,需要实现一个细节图,就是一个矩形框中加载一个大图,右下或者左下方有一个小矩形框,可以加载全图,并显示大矩形框中图片在全图的位置,有点拗口,直接上结果:

QQ录屏

一、使用QLabel

        最开始由于笔者对QGraphics不熟悉,当时有两个思路,但第一时间选择用QLabel。过程中也遇到了坐标映射的问题,在领导的指点下解决了,不过由于最后需求中需要拖动细节图的红框而大图中视角随之移动,这个需求完成不了,最后选择了不采用QLabel,也是笔者水平有限,要是你们用QLabel实现了的话,就更棒了。由于最后没有实现需求,代码这里就不放出来了!

二、使用QGraphics

        由于QLabel的失败,笔者就开始研究QGraphics,发现这个类用来加载图片简直太方便了。

1、自定义QGraphicsView

        首先,需要加载大图,我们这里需要在ui界面中拖入一个QGraphicsView控件,并点击右键提升为自定义控件类。这里要是不会提升自定义控件可以查阅相关博客或文章,并不难,其目的主要是用于处理鼠标滑轮和鼠标移动事件。同时新建一个类继承自QGraphicsView。

2、新建一个QGraphicsScene类

        view只是一个用来显示图片的窗口(视图),最后加载图片是通过设置item加载到scene(场景中)。新建一个QGraphicsScene类,方便在主线程中使用。

#ifndef MYSCENE_H
#define MYSCENE_H

#include <QObject>
#include <QGraphicsScene>
#include <QGraphicsItem>
class MyScene : public QGraphicsScene
{
  Q_OBJECT
public:
  MyScene();

};

#endif // MYSCENE_H
#include "myscene.h"

MyScene::MyScene()
{


}

3、将图片加载到scene中 

        先在mainwindow中设置场景和视图,再通过addItem将图片加载到场景中。由于graphicsview是ui的控件,所有这里不需要再实例化。

MyScene myscene;
QGraphicsItem *map;//头文件声明

 QImage image("work.png");//图片地址,自行修改
  map=new QGraphicsPixmapItem(QPixmap::fromImage(image));
  myscene.addItem(map);
  ui.graphicsView->setScene(&myscene);//给视图设置场景

此时就可以将图片加载到场景中!

4、鼠标滑轮放大事件 

        在自定义的QGraphicsView中重载鼠标滑轮事件。通过滑轮上下滑动即可放大缩小图片,其本质是缩小放大了view窗口相对于scene的大小,并没有实际地缩放scene中的图片。(代码段见6)

5、(细节图)新建一个QLabel提升为自定义控件

        细节图的思路就是用一个QLabel来加载图片,显示图片整体,并在其中用红色矩形框表示view在图片的范围。在ui界面拖入一个QLabel,然后新建一个mylabel的类继承自QLabel,然后提升自定义控件。

        QLabel控件中加载图片有两种思路,可以通过mainwindow中设置图片,也可以像笔者一样,通过信号槽,将图片发送到mylabel中,只需要在mainwindow中定义一个信号(void sendPixMap(QImage)),再在mylabel中定义一个槽函数(void getPixMap(QImage)),至于连接可以在mainwindow中连接,也可在ui界面正下方的Signals Slots Editor中连接,不过如果采用后者,需要在每个对象中右键“改变信号\槽”中添加对应的信号或槽。

        笔者给定了label的尺寸,所有加载时缩放了图片的尺寸,使之能适应label的尺寸。

        //缩放图片
qreal MyLabel::scaleImg(QImage &img){
  if((img.width()>this->width())||(img.height()>this->height())){
    double prop_w=(double)this->width()/(double)img.width();
    double prop_h=(double)this->height()/(double)img.height();
    if(prop_w>=prop_h){
      return prop_h;
    }else if(prop_w<prop_h){
      return prop_w;
    }
  }else{
    return 1;
  }
}

//得到图片
void MyLabel::getMap(QImage img1){
  isPixMap=true;
  img=img1;
  scale_size=scaleImg(img);
  img=img.scaled((double)img.width()*scale_size,(double)img.height()*scale_size);
}

重载绘图事件,使能在label中绘制图片。

//绘图事件
void MyLabel::paintEvent(QPaintEvent *event){
  QPainter painter(this);
  painter.drawPixmap(0,0,QPixmap::fromImage(img));
  update();//刷新
}

6、view中缩放图片,以及鼠标移动(拖拽图片)事件 

        重载mousemoveevent事件。

//view放大缩小(鼠标滑轮事件)
void MyView::wheelEvent(QWheelEvent * event)
{

  if (event->modifiers() == Qt::CTRL)
    {//按住ctrl键 可以放大缩小
      if((event->delta() > 0)&&(scale_m >= 50))//最大放大到原始图像的50倍
      {
        return;
      }
      else if((event->delta() < 0)&&(scale_m <= 0.01))//图像缩小到自适应大小之后就不继续缩小
      {
        return;//重置图片大小和位置,使之自适应控件窗口大小
      }
      else
      {
        // 当前放缩倍数;
        qreal scaleFactor = this->matrix().m11();
        scale_m = scaleFactor;
        int wheelDeltaValue = event->delta();
        // 向上滚动,放大;
        if (wheelDeltaValue > 0)
        {
          this->scale(1.2, 1.2);
          scale_/=1.2;
        }
        else
        {// 向下滚动,缩小;
          this->scale(1.0 / 1.2, 1.0 / 1.2);
          scale_*=1.2;
        }
        update();
      }
    }
}
//鼠标移动事件
void MyView::mouseMoveEvent(QMouseEvent *event){
  QPoint point(event->x(),event->y());
  emit sendMousePose(point);//实时显示鼠标在view中位置的信号
  if(!isPressed)return;
  QPointF lTInMap=mapToScene(leftTop); 
  emit sendLTScale(scale_,lTInMap,view_width,view_height);//显示view中图片在整体图片的位置
  QGraphicsView::mouseMoveEvent(event);//必须加
}
//鼠标按下事件
void MyView::mousePressEvent(QMouseEvent *event){
  isPressed=true;
  QGraphicsView::mousePressEvent(event);
}
//鼠标释放事件
void MyView::mouseReleaseEvent(QMouseEvent *event){
  isPressed=false;
 }

        由于在鼠标移动或按下时,会拦截该事件,所有我们在重载最后都需要在加上该事件,使其可以传到scene中 。同时滑动时放大,是通过view在scene中的左上角坐标,以及自身的长宽和缩放比来确定在scene中的范围,所有在鼠标滑轮事件和鼠标移动事件中,可以定义一个信号(void sendLTScale(qreal,QPointF,int,int)),实时传送此时view的各个参数,label中接受到后做如下处理:

void MyLabel::getLTScale(qreal scale_,QPointF lTop,int view_width,int view_height){
  QRectF rect2(lTop.x(),lTop.y(),view_width*scale_*scale_size*0.01,view_height*scale_*scale_size*0.01);//view映射出的矩形框
  pointLT=lTop;//label中红色矩形框左上角坐标
  rect_width=view_width*scale_*scale_size*0.01;
  rect_height=view_height*scale_*scale_size*0.01;
  rect=rect2;
}

上面这个是拖动或滑动滑轮,都会发送当前view在图片位置的信号,label中连接槽函数得到后,存到一个全局变量rect的矩形框中,然后label中的位绘图事件中再加入绘制矩形。

painter.drawRect(rect);

7、label中拖动矩形框rect

        上面实现了拖动view中图片,移动label中rect,此外我们还要拖动label中rect,随之view中视角改变。当然我们还需要把rect限制在图片的范围内。

//鼠标按下
void MyLabel::mousePressEvent(QMouseEvent *event){
  if(event->button()==Qt::LeftButton){
//判断鼠标按下时光标是否在矩形框内
    if((event->x()>=pointLT.x())&&(event->y()>=pointLT.y())&&(event->x()<=pointRB.x())&&(event->y()<=pointRB.y())){
      isPressed=true;
      startPoint=event->pos();//发送鼠标按下的坐标
      QPointF lTop(pointLT.x()/scale_size,pointLT.y()/scale_size);
      emit sendPressPoint(lTop);
    }
  }
}
//鼠标移动
void MyLabel::mouseMoveEvent(QMouseEvent *event){

  if(isPressed == false||rect.width()==img.width())
    return;
  endPoint=event->pos();//获得鼠标移动时每个点,x和y坐标减去前一个点的坐标就是移动的距离
  qreal temp_x=endPoint.x()-startPoint.x();
  qreal temp_y=endPoint.y()-startPoint.y();
//限制矩形框在图片内
  if(pointLT.x()+temp_x<=0){
    pointLT.setX(0);
  }
  else {
    if(pointLT.x()+rect_width +temp_x >=img.width()){
      pointLT.setX(img.width() - rect_width);
    }
    else {
      pointLT.setX(pointLT.x() + temp_x);
    }
  }

  if(pointLT.y() + temp_y<=0){
      pointLT.setY(0);
    }else {
      if(pointLT.y() +rect_height+ temp_y >=img.height()){
        pointLT.setY(img.height() - rect_height);
      }
      else {
        pointLT.setY(pointLT.y() + temp_y);
      }
    }

  QRectF rect2(pointLT.x(),pointLT.y(),rect_width,rect_height);
  rect=rect2;
  startPoint=endPoint;
  QPointF lTop(pointLT.x()/scale_size,pointLT.y()/scale_size);
  emit sendMovePoint(lTop);

}
//鼠标释放
void MyLabel::mouseReleaseEvent(QMouseEvent *event){
  if(event->button()==Qt::LeftButton){
    endPoint=event->pos();
    isPressed=false;
  }
}

8、item随之移动

上面拖动label中rect,鼠标实时发送光标位置,后一个减前一个坐标,并把当前坐标又赋值给前一个坐标,即可获得移动的距离。

但是,我们不能直接移动view(即不能使用view.move(x,y),这是在窗口中拖动view窗口),因为通过maptoscene这个函数发现,我们鼠标拖拽里面的图片,实际view映射到item上的坐标根本没有改变。笔者这里选择的是移动scene中的item。

void MainWindow::getMovePoint(QPointF temp){

  map->moveBy(-((double)temp.x()-(double)start_.x()),-((double)temp.y()-(double)start_.y()));
  emit sendMoveSize(((double)temp.x()-(double)start_.x()),((double)temp.y()-(double)start_.y()));
  start_=temp;
}

通过信号槽将鼠标的坐标发送到主线程中,因为我们是在mainwindow这个里面加入item,也可在这里移动item。

9、坐标映射问题

由于笔者上面移动item,虽然达到了拖动label中rect,view中视角随之移动,但是也引发了深层次问题,即我们拖动了label中rect,再讲鼠标放在view中拖拽图片或者放大缩小图片,就会发现,此时图片发现了便宜,坐标已经映射不到原来的坐标了。

最后,由于笔者水平有限,没有更好的办法,就选择在拖动label中rect,一旦在view中拖拽图片或放大缩小图片,我们就将偏移量还原回来,此时也达到了一定目的。希望笔者后续水平提升可以想出更好的方法。

思路就是在view中鼠标滑轮和按下事件中加一个判断,将item移动的偏移量,存在view的两个全局变量里,移动触发这两个事件,判断是否变量为0,不为0,就发送信号,主线程中接受到触发槽函数将item移动这两个偏移量,然后再在判断中将偏移量置零。

//view放大缩小
void MyView::wheelEvent(QWheelEvent * event)
{
  initView();//里面没啥东西,就是将view的width和height赋值给全局变量

  if (event->modifiers() == Qt::CTRL)
    {//按住ctrl键 可以放大缩小
    if(offset_h!=0||offset_w!=0){
      emit sendOffset(offset_w,offset_h);//发送偏移量
      offset_h=0;
      offset_w=0;//偏移量置零
      QPointF lTInMap=mapToScene(leftTop);
      emit sendLTScale(scale_,lTInMap,view_width,view_height);
    }
      if((event->delta() > 0)&&(scale_m >= 50))//最大放大到原始图像的50倍
      {
        return;
      }
      else if((event->delta() < 0)&&(scale_m <= 0.01))//图像缩小到自适应大小之后就不继续缩小
      {
        return;//重置图片大小和位置,使之自适应控件窗口大小
      }
      else
      {
        // 当前放缩倍数;
        qreal scaleFactor = this->matrix().m11();
        scale_m = scaleFactor;
        int wheelDeltaValue = event->delta();
        // 向上滚动,放大;
        if (wheelDeltaValue > 0)
        {
          this->scale(1.2, 1.2);
          scale_num*=1.2;
          scale_/=1.2;
        }
        else
        {// 向下滚动,缩小;
          this->scale(1.0 / 1.2, 1.0 / 1.2);
          scale_num/=1.2;
          scale_*=1.2;
        }
        update();
        rightButtom.setX(this->width());
        rightButtom.setY(this->height());
        QPointF lTInMap=mapToScene(leftTop);
        emit sendScale_m(scale_num);
        emit sendLTScale(scale_,lTInMap,view_width,view_height);
      }
    }
}
//鼠标移动事件
void MyView::mouseMoveEvent(QMouseEvent *event){
  QPoint point(event->x(),event->y());
  emit sendMousePose(point);
  if(!isPressed)return;
  QPointF lTInMap=mapToScene(leftTop); 
  emit sendLTScale(scale_,lTInMap,view_width,view_height);
  QGraphicsView::mouseMoveEvent(event);
}
//鼠标按下事件
void MyView::mousePressEvent(QMouseEvent *event){
  isPressed=true;
  if(offset_h!=0||offset_w!=0){
    emit sendOffset(offset_w,offset_h);
    offset_h=0;
    offset_w=0;
    QPointF lTInMap=mapToScene(leftTop);
    emit sendLTScale(scale_,lTInMap,view_width,view_height);
  }
  QGraphicsView::mousePressEvent(event);
}
//鼠标释放事件
void MyView::mouseReleaseEvent(QMouseEvent *event){
  isPressed=false;
 }

mainwindow接收到信号后,将item移动对应的偏移量。

void MainWindow::getOffset(double offset_w,double offset_h){
  map->moveBy(offset_w,offset_h);

接下来,笔者的工作还需要在item上画图,标点或画线,后续还会涉及到坐标转换的问题,额,几何学的差,哎~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT实现地图或图片的细节图(抓取图片的细节,放大图片) 的相关文章

  • RethinkDB成为Linux基金会的一员

    导读日前 xff0c RethinkDB项目有了新的动态 Cloud Native Computing基金会 xff08 CNCF xff09 宣布它购买了NoSQL分布式文件存储数据库RethinkDB的源代码版权 xff0c 将授权协议
  • STM32 汇编程序——串口输出 Hello world

    STM32 汇编程序 串口输出 Hello world 一 USART介绍二 Keil项目 xff08 一 xff09 新建项目 xff08 二 xff09 Hello s代码 xff08 三 xff09 编译生成hex文件 三 电路接法四
  • C语言笔记-头文件

    复习 xff1a 1 输出缓冲区 程序输出的数据并没有立即写入 文件 xff0c 而是先存储到输出缓冲区 xff0c 当满足一定条件时才写入文件中 xff1a 1 遇到 39 n 39 2 遇到输入语句 3 缓冲区满4k 4 程序结束 5
  • 不使用strcat()的字符串连接

    问题描述 在不使用strcat 的前提下 xff0c 实现两个字符串的连接 输入形式 以 39 39 为结束符的两行字符串 输出形式 将第一行字符串连接到第二行字符串 xff0c 然后打印输出 样例输入 abc def 样例输出 defab
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • 光流定位原理

    无人机上光流定位通常是借助于无人机底部的一个摄像头采集图像数据 xff0c 然后采用光流算法计算两帧图像的位移 xff0c 进而实现对无人机的定位 xff0c 这种定位手段配合GPS可以在室外实现对无人机的精准控制 xff0c 并且在市内没
  • 图形化UDP发包小工具

    文章目录 前言一 构思二 用到的python模块tkiner模块tkiner模块下载 socket模块ThreadPoolExecutor模块导入方式 编码实现客户端服务端代码 三 运行结果客户端发送消息服务端 前言 工具编写用的语言是py
  • C语言之调试技巧(VS2019编译器)

    C语言之调试技巧 xff08 VS2019编译器 xff09 一 什么是调试 xff1f 调试的作用1 1 什么是调试1 2 调试的基本步骤1 3 Debug版本和Release版本的介绍二 Windows环境调试的准备2 1 调试环境的准
  • 怎么在vscode上编写C语言代码

    1 准备工作 xff1a 在vscode的拓展里面下载安装c c 43 43 官方插件 此外 xff0c 需要安装一个c c 43 43 的编译器 MinGW xff0c MinGW 官网下载地址 xff08 点击即可进入官网 xff09
  • Ubuntu20.04系统安装ROS-noetic教程及常见问题的处理

    Ubuntu版本 xff1a 20 04 ROS版本 xff1a Noetic Ninjemys 注 xff1a Ubuntu系统版本要与ROS版本相对应 xff0c 不同版本的Ubuntu系统对应了不同的ROS版本 如Ubuntu20 0
  • 笔记(STM32篇)day2——GPIO及寄存器映射

    目录 一 GPIO结构及模式 1 推挽输出 2 开漏输出 3 复用功能输出 4 上拉 下拉输入 5 复用功能输入与模拟输入 二 寄存器映射 一 GPIO结构及模式 图1 GPIO基本结构 如图1所示为GPIO基本结构 xff0c 右侧I O
  • 笔记(STM32篇)day3——寄存器结构体、端口置位函数

    目录 一些C知识点 1 define和typedef的区别 2 结构体struct 3 结构体中 和 gt 的区别 4 c文件和 h文件的关系 5 防止重复引用 一 寄存器结构体定义 1 定义结构体变量指针 2 寄存器赋值 二 端口置位函数
  • 笔记(STM32篇)day6——按键控制

    目录 一 按键硬件图 1 硬件原理 2 输入方式选择 二 功能实现 1 按键GPIO配置 2 按键扫描函数 3 LED翻转宏定义 4 主程序 参考 一 按键硬件图 1 硬件原理 按键的硬件原理图如图 xff0c 右侧接3 3V xff0c
  • 笔记(STM32篇)day8——系统时钟配置、MCO输出系统时钟

    目录 一 时钟框图 二 配置过程 1 系统时钟配置函数 2 MCO配置 参考 一 时钟框图 下图就是STM32F10x的时钟系统框图 xff0c 此处用的正点原子的图 xff0c 左侧四个蓝色的分别是 xff1a 高速内部RC时钟 xff0
  • pixhawk博客导读

    写的东西有点多 xff0c 写的也有点乱 xff0c 看题目也不知道内容是什么 xff0c 为了方便网友观看自己感兴趣的地方 xff0c 笔者把pixhawk博客归类一下 由于笔者也是边学习边写的 xff0c 难免有错误 xff0c 还请多
  • 笔记(STM32篇)day13——USART串口与PC通信实例

    USART 常用来实现控制器与电脑之间的数据传输 这使得我们调试程序非常方便 xff0c 比如我们可以把一些变量的值 函数的返回值 寄存器标志位等等通过 USART 发送到串口调试助手 xff0c 这样我们可以非常清楚程序的运行状态 xff
  • Leetcode 566. 重塑矩阵(C++矩阵容器)

    题目 输入 xff1a mat 61 1 2 3 4 r 61 1 c 61 4 输出 xff1a 1 2 3 4 思路 将原二维数组变成一维数组 xff0c 在重新放入变换后的二维数组 可以使用一维数组过渡 xff0c 也可以直接用整数除
  • 笔记(嵌入式Linux C篇)4——创建顺序存储表(二级指针方法)

    顺序存储表 概念等同于一个数组 xff0c 使用结构体定义 xff0c 成员为一个某类型的数组 xff0c 以及一个整形的last xff0c 作用是指示顺序存储表最后一个元素的下标 xff0c last默认为 1即数组为空 typedef
  • 笔记(嵌入式Linux C篇)5——单链表(有头节点)

    链表 数据元素随机存储 xff0c 通过指针表示数据之间的逻辑关系的结构就是链式存储结构 xff0c 即链表 一个链表节点包括一个数据域和一个指针域 数据域存储数据 xff0c 指针域存储下一个节点的地址 链表的结构体声明如下 xff1a
  • 实现对单链表的赋值、去重、拆分、排序。

    在一个带头结点的单链表A中 xff0c 自行输入A中的元素值 xff0c 请实现 xff1a xff08 1 xff09 将链表A中值相同的结点 xff0c 仅保留第一次出现的结点 xff1b xff08 2 xff09 将新得到的A链表

随机推荐

  • Linux高级编程——网络通信实现TCP(1)

    基于TCP协议的文件传输 xff08 套接字 xff09 实例 xff1a 客户端 xff1a 只用于收文件 xff1b 执行命令 xff1a 执行文件名 IP Port span class token comment 客户端 输入 执行
  • FPGA学习笔记—UART,RS485串口通信(verilog)

    目录 一 串口通信基础知识1 什么是串口 xff1f 2 同步通信和异步通信3 串行通信的传输方向4 常见的串口通信接口 二 UART串口通信UART基础知识1 协议层 xff1a 通信协议 xff08 包括数据格式 xff0c 传输速率等
  • 使用多线程编码实现:火车站卖票实例,四个卖票窗口随机卖出50张票

    public class Test 火车票 public static void main String args TicketWindow th1 61 new TicketWindow TicketWindow th2 61 new T
  • 【Arduino】arduino使用l298n的代码分享

    一 接线 二 使用步骤 int Left motor go 61 8 左电机前进 IN1 int Left motor back 61 9 左电机后退 IN2 int Right motor go 61 10 右电机前进 IN3 int R
  • Arduino基础与常用函数

    文章目录 1 Arduino语言2 Arduino代码结构1 类似于C的头文件包含 xff0c 变量定义等2 void setup 3 void loop 3 串口常用函数1 串口收发函数 Serial begin speed 2 读取串口
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • ESP8266 读取多个传感器数据(风速、风向、颗粒物、CO)

    文章目录 1 ESP8266开发板资源2 Arduino编程1 准备工作2 读取多个串口数据1 定义软串口 2 涉及传感器简介 3 集成代码 xff08 注释详细 xff09 4 Arduino 串口监视器 1 ESP8266开发板资源 一
  • ESP8266采集多个传感器数据通过WIFI上传到本地数据库(风速、风向、CO、颗粒物)

    文章目录 1 数据库使用简介1 Navicat premium连接2 新建数据库3 在数据库中新建表 2 代码实现代码 1 数据库使用简介 建立数据库连接 xff0c 在连接里新建数据库 xff0c 在数据库里新建表 1 Navicat p
  • STM32读取串口传感器(颗粒物传感器,被动传输)

    文章目录 1 串口2中断 xff08 在主动上传的基础上 xff09 1 添加发送字符和数组函数2 主函数调用3 串口助手接收数据 2 遇到的串口通信不成功问题 1 串口2中断 xff08 在主动上传的基础上 xff09 1 添加发送字符和
  • STM32采集问答式串口传感器数据写入SD卡(spi模式)

    文章目录 1 实验工具2 接线说明3 部分代码说明1 文件的覆盖问题1 文件系统的文件打开方式2 移动文件初始写入指针位置 2 变量的转换及写入问题1 sprintf函数2 CSV文件创建 3 数据采集流程 xff08 主函数 中断函数处理
  • (1)STM32 RC522模块测试代码

    文章目录 1 使用资源2 RC522模块2 1 RC522简介2 2 RC522工作模式 3 模块测试代码 工程文件源码链接 1 使用资源 使用32 的SPI1资源 xff1a SDA PA4 RST PA1 普通io SCK PA5 MI
  • (3)STM32 SG90舵机模块测试

    文章目录 1 资源简介2 测试源码 1 资源简介 stm32 rct6板SG90舵机模块 接线引脚 xff1a 橙色 xff1a 信号线 红色 xff1a 电源 43 5v 咖色 xff1a GND 此模块三条线固定在一起 xff0c 如果
  • (4) STM32 AS608指纹识别模块测试代码

    文章目录 1 使用资源2 实现思路简述3 指纹测试代码3 1 部分代码介绍3 2 源码链接 1 使用资源 stm32RCT6板子AS608指纹模块 软件资源 xff1a 串口二资源连接AS608 TX RX接线AS608 wak线连接PA8
  • 通过路由器连接JetsonNano与地面站

    通过路由器连接JetsonNano与地面站 一 前期准备注意事项连接局域网虚拟机网络设置 二 获取IP地址和设备名称IP地址设备名称 三 配置Nano修改bashrc文件修改hosts文件 四 配置地面站修改bashrc文件修改hosts文
  • jvm 堆 栈中存什么?

    数据类型 Java虚拟机中 xff0c 数据类型可以分为两类 xff1a 基本类型和引用类型 基本类型的变量保存原始值 xff0c 即 xff1a 他代表的 值就是数值本身 xff1b 而引用类型的变量保存引用值 引用值 代表了某个对象的引
  • YOLOv5 数据集划分及生成labels

    0 本人文件夹存放格式 xff08 因为要测试多个数据集和不同的yolov5版本和其他算法 xff0c 所以数据集整体放到外面 xff09 1 划分数据集 验证集 测试集 coding utf 8 import os import rand
  • mission planner发送数据之mavlink

    前段时间研究mp的地面站 xff0c 看了几天有点体会 xff0c 看网上的解析比较少 xff0c 写上来和大家分享下 xff0c 全是自己的理解 xff0c 东西比较少 xff0c 硬货不多 xff0c 还请见谅 最开始是想做个无人机超声
  • 实验三、嵌入式Linux网络通信实验

    实验三 嵌入式Linux网络通信实验 一 实验目的 1 掌握TCP与UDP协议原理 2 掌握套接字通信原理 2 掌握TCP套接字服务器端与客户端通信方法 二 实验基本要求 1 学习TCP与UDP协议原理 2 掌握TCP套接字服务器端与客户端
  • QT重载keyPress焦点问题

    最近项目上需要用到键盘上的快捷键 xff0c 就重载了键盘的按下事件 xff0c 以为万事大吉 实际界面上有很多控件 xff0c 导致如果鼠标点击了其中一个不能接收焦点的控件 xff0c 就不知道焦点传到了什么地方 上网查大致两种思路 xf
  • QT实现地图或图片的细节图(抓取图片的细节,放大图片)

    最近由于项目上的要求 xff0c 需要实现一个细节图 xff0c 就是一个矩形框中加载一个大图 xff0c 右下或者左下方有一个小矩形框 xff0c 可以加载全图 xff0c 并显示大矩形框中图片在全图的位置 xff0c 有点拗口 xff0