opencv学习手册(四)(控制无人机自动跟踪目标(上))(目标识别、自动跟踪)

2023-05-16

如何让机器人识别面前的绿色小球并且进行自动跟随?

先把问题拆成两个子问题。第一,识别绿色小球;第二,自动跟随。

目标识别

目标识别分为三步:

  1. 图像预处理(定义结构元素,HSV 转换,腐蚀与膨胀)
  2. 轮廓检测
  3. 矩形绘制

图像预处理

# 定义结构化元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

我们使用cv2.getStructuringElement函数生成结构化元素。
该函数需要两个参数。第一个参数,控制元素的形状。第二个参数,控制元素的大小。
详细用法指路——> opencv-python结构化元素cv2.getStructuringElement()

 # 设定颜色HSV数值范围
    sensity = 10
    green_lower = np.array([50-sensity,43,46])
    green_upper = np.array([60+sensity,255,255])
    # 将图像转成HSV颜色空间
    hsv_frame = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 基于颜色的物体提取
    mask = cv2.inRange(hsv_frame, green_lower,green_upper)
    mask2 = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask3 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernel)
    # 缝隙填充
    mask4 = FillHole(mask3)
    mask5 = cv_erodedAndDilated(mask4)
    # 轮廓检测
    cnt,heridency = cv2.findContours(mask5,
                                     cv2.RETR_EXTERNAL,
                                     cv2.CHAIN_APPROX_SIMPLE)
  	# 使用面积最大区域
    maxArea = 0
    maxIndex = 0
    for i, j in enumerate(cnt):
        area = cv2.contourArea(j)
        if area > maxArea:
            maxArea = area
            maxIndex = i
    cv2.drawContours(img,cnt,maxIndex,(255,0,255),10)
    # x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
    x, y, w, h = cv2.boundingRect(np.array(cnt[maxIndex]))
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)                              

使用cv2.boundingRect函数报错的解决方法——>python报错error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function boundingRect

运动控制

运动控制分为四步:

  1. 定义标准位置与大小
  2. 方位判断
  3. 速度控制

定义标准位置与大小

把标准位置定义在相机中心,标准大小可以自行设置需要的像素点。

# 定义标准位置
height,width,layer = img.shape
center_x = height/2
center_y = width/2
# 定义标准距离下目标物体大小
# 960*720 = 691200
size = 6000
area = w*h
robot_x = x+w/2
robot_y = y+h/2

方位判断

在无人机的飞行过程中,通过不断比较目标位置与标准位置,来判断无人机的方位。

# 定义方向变量
left_sign = 0
right_sign = 0
forward_sign = 0
up_sign = 0
down_sign = 0
# 判断前后速度
if area < size and area > size-2000:
    forward_sign = 1
elif area > size-4000 and area <= size-2000:
    forward_sign = 2
elif area <= size-4000 and size > 0:
    forward_sign = 3
if area >= size and area < size+100000:
    forward_sign = -1
elif area >= size+100000 and area < size+300000:
    forward_sign = -2
elif area > size+300000:
    forward_sign = -3
# 判断左侧横向速度
if robot_x < center_x and robot_x > center_x-120:
    left_sign = 1
elif robot_x <= center_x-120 and robot_x >= center_x-240:
    left_sign = 2
elif robot_x < center_x-240:
    left_sign =3
# 判断右侧横向速度
if robot_x > center_x and robot_x < center_x+120:
    right_sign = 1
elif robot_x >= center_x+120 and robot_x <= center_x+240:
    right_sign = 2
elif robot_x > center_x+240:
    right_sign =3

速度控制

无人机遥控有四个杆量,横滚、俯仰、油门、偏航。这四个杆量表示飞机运动的四个自由度。
在这里插入图片描述

横滚,控制无人机左右移动;
俯仰,控制无人机前后移动;
油门,控制无人机高度;
偏航,控制无人机水平方向的角度;

 """
            控制飞机遥控器的四个杆量
            参数:	
            a – float:[-100, 100] 横滚
            b – float:[-100, 100] 俯仰
            c – float:[-100, 100] 油门
            d – float:[-100, 100] 偏航
            """
            # 设定杆量参数集
            a_level = [25,35,45]
            b_level_forward = [15,25,40]
            b_level_backward = [-30,-45,-60]
            # # 控制前后进
            if forward == 1:
                tl_flight.rc(b=b_level_forward[0])
            elif forward == 2:
                tl_flight.rc(b=b_level_forward[1])
            elif forward == 3:
                tl_flight.rc(b=b_level_forward[2])
            elif forward == 0:
                tl_flight.rc(b=0)
            elif forward == -1:
                tl_flight.rc(b=b_level_backward[0])
            elif forward == -2:
                tl_flight.rc(b=b_level_backward[1])
            elif forward == -3:
                tl_flight.rc(b=b_level_backward[2])
            # 控制左右向
            if left == 1:
                tl_flight.rc(a=-a_level[0])
            elif left == 2:
                tl_flight.rc(a=-a_level[1])
            elif left == 3:
                tl_flight.rc(a=-a_level[2])
            elif right == 1:
                tl_flight.rc(a=a_level[0])
            elif right == 2:
                tl_flight.rc(a=a_level[1])
            elif right == 3:
                tl_flight.rc(a=a_level[2])
            elif right == 0 and left == 0:
                tl_flight.rc(a=0)

代码汇总

# -*- coding: utf-8 -*-
import time
from robomaster import robot,battery
from robomaster import camera
import cv2
import numpy as np
import sys
sys.path.append(r'P:\Python\cv2') # 这里是我的路径,你的路径会不一样
from string_recognise_self import cv_show,FillHole,cv_drawContours,cv_center,cv_erodedAndDilated

"""碎片填充"""
def FillHole(img,SavePath='img_fillhole.jpg'):
    img_in = img
    # 复制 im_in 图像
    img_floodfill = img_in.copy()    
    # Mask 用于 floodFill,官方要求长宽+2
    h, w = img_in.shape[:2]
    mask = np.zeros((h+2, w+2), np.uint8)    
    # floodFill函数中的seedPoint必须是背景
    isbreak = False
    for i in range(img_floodfill.shape[0]):
        for j in range(img_floodfill.shape[1]):
            if(img_floodfill[i][j]==0):
                seedPoint=(i,j)
                isbreak = True
                break
        if(isbreak):
            break
    # 得到im_floodfill
    cv2.floodFill(img_floodfill, mask, seedPoint, 255);
    # 得到im_floodfill的逆im_floodfill_inv
    img_floodfill_inv = cv2.bitwise_not(img_floodfill)
    img_out = img_in | img_floodfill_inv
    cv2.imwrite(SavePath, img_out)
    return img_out
    
"""腐蚀与膨胀"""
def cv_erodedAndDilated(img):
    # 定义结构化元素
    size = 20
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(size,size))
    # 腐蚀图像
    eroded = cv2.erode(img, kernel)
    # 膨胀图像
    img_dilated = cv2.dilate(eroded, kernel)
    return img_dilated

"""小球位置识别"""   
def cv_center(img):
    # 定义结构化元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    # 定义标准位置
    height,width,layer = img.shape
    center_x = height/2
    center_y = width/2
    # 设定颜色HSV数值范围
    sensity = 10
    green_lower = np.array([50-sensity,43,46])
    green_upper = np.array([60+sensity,255,255])
    # 将图像转成HSV颜色空间
    hsv_frame = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 基于颜色的物体提取
    mask = cv2.inRange(hsv_frame, green_lower,green_upper)
    mask2 = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask3 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernel)
    # 缝隙填充
    mask4 = FillHole(mask3)
    mask5 = cv_erodedAndDilated(mask4)
    # 轮廓检测
    cnt,heridency = cv2.findContours(mask5,
                                     cv2.RETR_EXTERNAL,
                                     cv2.CHAIN_APPROX_SIMPLE)
    if cnt == []:
        continue
    # 找出面积最大区域
    maxArea = 0
    maxIndex = 0
    for i, j in enumerate(cnt):
        area = cv2.contourArea(j)
        if area > maxArea:
            maxArea = area
            maxIndex = i
    cv2.drawContours(img,cnt,maxIndex,(255,0,255),10)
    # x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
    x, y, w, h = cv2.boundingRect(np.array(cnt[maxIndex]))
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    # 定义标准距离下目标物体大小
    # 960*720 = 691200
    size = 6000
    area = w*h
    robot_x = x+w/2
    robot_y = y+h/2
    # 定义方向变量
    left_sign = 0
    right_sign = 0
    forward_sign = 0
    up_sign = 0
    down_sign = 0
    # 判断前后速度
    if area < size and area > size-2000:
        forward_sign = 1
    elif area > size-4000 and area <= size-2000:
        forward_sign = 2
    elif area <= size-4000 and size > 0:
        forward_sign = 3
    if area >= size and area < size+100000:
        forward_sign = -1
    elif area >= size+100000 and area < size+300000:
        forward_sign = -2
    elif area > size+300000:
        forward_sign = -3
    # 判断左侧横向速度
    if robot_x < center_x and robot_x > center_x-120:
        left_sign = 1
    elif robot_x <= center_x-120 and robot_x >= center_x-240:
        left_sign = 2
    elif robot_x < center_x-240:
        left_sign =3
    # 判断右侧横向速度
    if robot_x > center_x and robot_x < center_x+120:
        right_sign = 1
    elif robot_x >= center_x+120 and robot_x <= center_x+240:
        right_sign = 2
    elif robot_x > center_x+240:
        right_sign =3
    # 判断飞机飞行高度
    # 没有必要,因为小球的高度是固定
    # 如果想要进行高度判断,这其实是一个难点。因为目标物在前后和上下两个维度上的移动
    # 都会导致y坐标的变化。y坐标变化的因素有两个,需要把这两个因素综合考虑。
    return forward_sign,left_sign,right_sign

if __name__ == '__main__':
    tl_drone = robot.Drone()
    # 指定连接方式为AP 直连模式
    tl_drone.initialize()
    tl_flight = tl_drone.flight
    tl_camera = tl_drone.camera 
    tl_battery = tl_drone.battery
    # 获取飞机电量信息
    print('battery=\t'+str(tl_battery.get_battery())+'%')
    cnt = []
    # 获取飞机机身温度
    print(tl_drone.get_temp())
    # 控制飞机起飞
    tl_flight.takeoff().wait_for_completed()
    # 控制飞机飞行,单位cm
    # 设置飞机帧率
    tl_camera.set_fps(fps='high')
    # 设置飞机码率
    tl_camera.set_bitrate(bitrate=6)
    # 设置飞机分辨率
    tl_camera.set_resolution(resolution='high')
    # 获取视频流
    tl_camera.start_video_stream(display=False)
    try:
        while True:
            img = tl_camera.read_cv2_image(strategy='newest')
            forward,left,right = cv_center(img)
            """
            控制飞机遥控器的四个杆量
            参数:	
            a – float:[-100, 100] 横滚
            b – float:[-100, 100] 俯仰
            c – float:[-100, 100] 油门
            d – float:[-100, 100] 偏航
            """
            # 设定杆量参数集
            a_level = [25,35,45]
            b_level_forward = [15,25,40]
            b_level_backward = [-30,-45,-60]
            # # 控制前后进
            if forward == 1:
                tl_flight.rc(b=b_level_forward[0])
            elif forward == 2:
                tl_flight.rc(b=b_level_forward[1])
            elif forward == 3:
                tl_flight.rc(b=b_level_forward[2])
            elif forward == 0:
                tl_flight.rc(b=0)
            elif forward == -1:
                tl_flight.rc(b=b_level_backward[0])
            elif forward == -2:
                tl_flight.rc(b=b_level_backward[1])
            elif forward == -3:
                tl_flight.rc(b=b_level_backward[2])
            # 控制左右向
            if left == 1:
                tl_flight.rc(a=-a_level[0])
            elif left == 2:
                tl_flight.rc(a=-a_level[1])
            elif left == 3:
                tl_flight.rc(a=-a_level[2])
            elif right == 1:
                tl_flight.rc(a=a_level[0])
            elif right == 2:
                tl_flight.rc(a=a_level[1])
            elif right == 3:
                tl_flight.rc(a=a_level[2])
            elif right == 0 and left == 0:
                tl_flight.rc(a=0)
            time.sleep(0.08)
            cv2.namedWindow('Drone', 0)
            cv2.imshow("Drone", img)
            cv2.waitKey(10)
            tl_flight.rc(a=0,b=0,c=0,d=0)
    except KeyboardInterrupt:
        pass
    cv2.destroyAllWindows()
    tl_camera.stop_video_stream()         
    # 控制飞机降落
    tl_flight.land().wait_for_completed()
    # 关闭无人机对象
    tl_drone.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv学习手册(四)(控制无人机自动跟踪目标(上))(目标识别、自动跟踪) 的相关文章

  • Python运维自动化psutil 模块详解(超级详细)

    psutil 模块 参考官方文档 xff1a https pypi org project psutil 一 psutil简介 psutil是一个开源且跨平台 xff08 http code google com p psutil xff0
  • 2021最强Python学习教程,从零基础入门到精通

    关于本套Python自学视频教程 xff1a B站链接 xff1a 戳我直达 千锤百炼 xff0c 只为大作 xff1b 精益求精 xff0c 处处斟酌 xff1b 这种教程 xff0c 看一眼就倾心 你准备好了吗 文章目录 你准备好了吗
  • 进程池(multiprocess.Pool)

    进程池 multiprocess Pool 一 进程池概念 1 什么是进程池 x1f449 进程池是资源进程 管理进程组成的技术的应用 2 为什么要有进程池 x1f62e 忙时会有成千上万的任务需要被执行 xff0c 闲时可能只有零星任务
  • 使用pip安装第三方模块报错,WARNING: You are using pip version 20.2.1; however, version 21.0.1 is available. You

    问题 xff1a 使用pip安装第三方模块报错 xff0c WARNING You are using pip version 20 2 1 however version 21 0 1 is available You should co
  • python小数据池,代码块的深入剖析

    python小数据池 xff0c 代码块的深入剖析 文章目录 python小数据池 xff0c 代码块的深入剖析一 id xff0c is xff0c 61 61 二 代码块三 代码块的缓存机制四 小数据池五 小结 一 id xff0c i
  • docker 之Dockerfile

    Docker 镜像构建之 Dockerfile 在 Docker 中构建镜像最常用的方式 xff0c 就是使用 Dockerfile Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说
  • 项目开发的完整流程(详解版)

    项目开发的完整流程 前言 一般情况下 xff0c 企业开发软件时会按照基线和定制两块并行方式执行项目开发工作 无论什么公司 xff0c 都需要遵从一套成熟的产品研发过程体系 xff0c 才能做出质量较好的产品 因此 xff0c 如果出现项目
  • nerfstudio介绍及在windows上的配置、使用

    nerfstudio提供了一个简单的API xff0c 可以简化创建 训练和可视化NeRF的端到端过程 该库通过模块化每个组件来支持可解释的NeRF实现 nerfstudio源码地址 https github com nerfstudio
  • pip源

    02 pip源更换 前面已经介绍过pip软件包管理工具基本使用及换源 链接 一 国内常用镜像源 清华大学 xff1a https pypi tuna tsinghua edu cn simple 阿里云 xff1a http mirrors
  • mysql启动失败,报错:Job for mysqld.service failed

    无论安装多少次mysql xff0c 仍然会出现各种各样的错误 xff0c 无可奈何 xff0c 只能和mysql硬刚了 xff01 所以最好的解决方案是查看错误日志 xff0c 去解决懵逼的代码错误 错误如图所示 xff1a 百度了好久
  • linux 安装SQL Server 2019

    可以直接参考官方文档 xff1a https docs microsoft com zh cn sql linux quickstart install connect red hat view 61 sql server ver15 一
  • Go 数组与切片

    Go 数组与切片 一 数组 1 1 数组定义与基本语法 数组 是一个由 固定长度 的特定类型元素组成的序列 xff0c 一个数组可以由零个或多个元素组成 在Go语言中 xff0c 数组从声明时就确定 xff0c 使用时可以修改数组成员 xf
  • linux安装chrome以及驱动

    一 安装chrome 下载安装脚本 span class token function wget span https intoli com install google chrome sh 然后授予可执行权限 span class tok
  • ardupilot编译过程,通过makefile的形式编译,分析make px4-v2指令

    ardupilot编译过程 xff0c 通过makefile的形式编译 xff0c 分析make px4 v2指令 我们都知道平时用的编译命令是make px4 v2 但是为什么是这个呢 xff0c 这个命令是怎样执行的呢 xff0c 挑干
  • AVT工业相机Windows、Opencv开发——驱动相机(超详细)

    一 概述 1 1使用Vimba控制相机需要经历以下几个步骤 1 打开Vimba 2 查找相机列表 3 打开特定相机 4 配置参数 xff08 可选 xff09 5 采集 xff1a 采集过程共分为5步 xff0c 具体见1 2 6 关闭相机
  • python-opencv尺寸测量

    首先 xff0c 利用机器视觉来测定零件尺寸 xff0c 我们能够直接得到的是图片的像素 xff0c 要想获得尺寸大小 xff0c 我们必须找到像素和实际尺寸间的关系 我们在这里定义一个比例概念 xff1a 每度量比的像素 xff08 pi
  • Bounding box(bbox) 预测

    在出现Bounding box预测之前 xff0c 一般都是通过滑动窗口进行目标检测 本文前两部分介绍滑动窗口算法 xff0c 这样是为了更好介绍 bounding box如何引出 为了解决什么问题而引出的 也可直接跳跃到第三部分看有关bo
  • YOLOv3网络结构分析以及工作流程

    注意 xff1a 本文章有很多图 xff0c 但是都是YOLOv3的结构图 xff0c 只是每张图表达出的信息都各有特色 xff0c 可将这些结构图结合起来 xff0c 能更好的理解 1 Darknet 53 模型结构 在论文中虽然有给网络
  • Qt中QDebug的使用

    QDebug类为调试信息 debugging information 提供输出流 它的声明在 lt QDebug gt 中 xff0c 实现在Core模块中 将调试或跟踪信息 debugging or tracing information
  • Ubuntu18.04安装教程——超详细的图文教程

    电脑配置 xff1a 名称 xff1a Lenovo 拯救者Y7000P 处理器 xff1a i7 10750H 内存 xff1a 32G 固态 xff1a 1TB 显卡 xff1a RTX2060 6G 一 准备工作 本文以 Ubuntu

随机推荐

  • Ubuntu18.04启动后无法进入桌面修复方法(图文)

    引言 xff08 吐槽可略过 xff09 xff1a Ubuntu是应用广泛的Linux操作系统 xff0c 特别是在机器学习应用中 xff0c 通过调用NVIDIA显卡的GPU进行计算和研究的主要平台之一 但是由于NV显卡的存在 xff0
  • VINS-Course代码解析——run_euroc前端数据处理

    vins mono总框架如下 xff1a 主要分为三大块 xff1a 我们先从主函数 main 入手 xff1a 主函数中有三个线程 xff0c 读取完数据集和配置文件的路径后就会进入这三个线程 xff0c 如下图 xff1a thd Ba
  • Gazebo11的更新与安装

    Melodic自带的Gazebo版本过低 xff0c 建议升级 Gazebo安装见gazebo官网 需注意以下四点 删除gazebo9以及相关插件选用Alternative installation step by step的安装方式 xf
  • XTDrone目标检测

    编译Darkent ROS 方法一 xff1a xff08 推荐 xff09 直接clone xff0c 记得加 recurse submodules xff0c 防止文件缺失 cd span class token operator sp
  • C++求解N个数的最大公约数、最小公倍数

    一 2个数的最大公约数 span class token comment 辗转相除法 span span class token keyword int span span class token function gcd span spa
  • 子序列个数——动态规划

    题目 xff1a 统计一个字符串中全部不同的子序列的个数 思路 xff1a 动态规划求解 令 f i 61 前 i 个元素中包含的全部子序列的个数 那么状态转移方程分为下面两种情况 xff1a 当第 i 个元素在前面 i 1 个字符中没有出
  • 字符串中特定子序列出现的次数(动态规划)

    题目 xff1a 给定一个字符串 xff0c 求子序列 cwbc 出现的次数 思路 xff1a 动态规划 令 dp i j 表示前 i 个字符中匹配了字符串 cwbc 中前 j 位 xff08 j 61 1 2 3 4 xff09 的个数
  • VMware ubuntu虚拟机无法上网的解决办法(笔记本连接WIFI情况)

    文章目录 一 虚拟机网络配置 一 虚拟机网络配置 1 设置Ubuntu网络适配器的网络连接方式为NAT模式 2 还原虚拟机网络配置 还原一下默认设置 3 window网络适配器设置适配器允许网络共享 4 Ubuntu启用联网 xff0c 连
  • ubuntu在树梅派上之VNC

    启动vncserver vncserver span class token operator span geometry 1600x900 杀死第一个桌面 vncserver span class token operator span
  • Sourcetree介绍及使用

    Sourcetree是一个操作简单但功能强大的免费Git客户端管理工具 xff0c 可应用在Windows和Mac平台 Sourcetree的安装 xff1a 1 从Sourcetree Free Git GUI for Mac and W
  • javascript创建一个基于数组的栈结构

    栈是一种遵从后进先出 xff08 LIFO xff09 原则的有序集合 新添加或待删除的元素都保存在栈的同 一端 xff0c 称作栈顶 xff0c 另一端就叫栈底 在栈里 xff0c 新元素都靠近栈顶 xff0c 旧元素都接近栈底 栈拥有以
  • Ubuntu16.04+RealsenseT265跑通VINS-Fusion

    一 提前条件 系统版本 xff1a ubuntu16 04 43 ROS xff08 kinetic xff09 默认已经掌握了ubuntu系统下的基本命令以及ROS的基本操作 二 realsenseT265的SDK测试 官方网站https
  • Why Kubernetes ,我对Kubernetes的理解

    去年换工作后 xff0c 开始真正在生产环境中接触容器与Kubernetes 边恶补相关知识的同时 xff0c 也想把学到的内容和自己的理解整理出来 学习的途径包括k8s官方文档 书籍 极客时间专栏及网上各种博文 所涉及一些摘抄或描述 xf
  • Kubernetes的几种主流部署方式01-minikube部署

    综述 Kubernetes集群的组件众多 xff0c 要部署一套符合生产环境的集群不是一件容易的事 好在随着社区的快速发展 xff0c 特别是在它成为事实上的容器编排标准以后 xff0c 基本所有的主流云平台都完全支持Kubernetes
  • Kubernetes 1.14版本的亮点新功能

    部分翻译自https sysdig com blog whats new kubernetes 1 14 Kubernetes 1 14的亮点新功能 xff1a 支持Windows容器服务可以通过kubeadm动态地创建一个高可用集群将ku
  • Kubernetes的几种主流部署方式02-kubeadm部署1.14版本高可用集群

    在上篇文章minikube部署中 xff0c 有提到Minikube部署Kubernetes的核心就是Kubeadm xff0c 这篇文章来详细说明下Kubeadm原理及部署步骤 写这篇文章的时候 xff0c Kubernetes1 14刚
  • Kubectl常用命令详解

    要使用和维护Kubernetes集群 xff0c 最常用且直接的方式 xff0c 就是使用自带的命令行工具Kubectl 这里梳理下常用的子命令及参数 xff0c 方便查找参考 参考文档 xff1a Overview of kubectlk
  • Word | 关于删除分节符(下一页)前面的版式就乱了解决方案

    WORD中删除分节符有这样的规定 xff1a 如果要删除分节符 xff0c 只要把光标移动到该分节符上 xff0c 按Delete键即可 但是要注意该分节符前面的文字将合并到后面的节中 xff0c 并且采用后者的格式设置 解决方法 xff1
  • sheetjs在使用中日期被自动转换问题

    在vue开发后台中 xff0c 需求是前端上传csv文件 xff0c 解析成对象数组 xff0c 找到了插件SheetJS js xlsx npm i xlsx span class token operator span span cla
  • opencv学习手册(四)(控制无人机自动跟踪目标(上))(目标识别、自动跟踪)

    如何让机器人识别面前的绿色小球并且进行自动跟随 xff1f 先把问题拆成两个子问题 第一 xff0c 识别绿色小球 xff1b 第二 xff0c 自动跟随 目标识别 目标识别分为三步 xff1a 图像预处理 xff08 定义结构元素 xff