OpenCV模板匹配识别图片中的数字

2023-05-16

OpenCV模板匹配识别图片中的数字

前言

本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出“读取失败”。

操作环境:

  • OpenCV - 4.1.0
  • Python 3.8.1

程序目标

单个数字模板:(这些单个模板是我自己直接从图片上截取下来的)

在这里插入图片描述

要处理的图片:

在这里插入图片描述

终端输出:

在这里插入图片描述

文本输出:

在这里插入图片描述

思路讲解

在这里插入图片描述

代码讲解

首先定义两个会用到的函数

第一个是显示图片的函数,这样的话在显示图片的时候就比较方便了

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

第二个是图片缩放的函数

def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized

先把这个代码贴出来,方便后面单个函数代码的理解。

if __name__ == "__main__":
    # 存放数字模板列表
    digits = []
    # 当前运行目录
    now_dir = os.getcwd()
    print("当前运行目录:" + now_dir)
    numbers_address = now_dir + "\\numbers"
    load_digits()
    times = input("请输入程序运行次数:")
    for i in range(1, int(times) + 1):
        demo(i)
    print("输出成功,请检查本地temp.txt文件")
    while True:
        if input("输入小写‘q’并回车退出") == 'q':
            break

接下来是第一个主要函数,功能是加载数字模板并进行处理。

这个函数使用到了os模块,所以需要在开头import os

def load_digits():
    # 加载数字模板
    path = numbers_address    # 这个地方就是获取当前运行目录 获取函数在主函数里面
    filename = os.listdir(path)    # 获取文件夹文件
    for file in filename:
        img = cv2.imread(numbers_address + "\\" + file)    # 读取图片
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 灰度处理
        # 自动阈值二值化 把图片处理成黑底白字
        img_temp = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        # 寻找数字轮廓
        cnt = cv2.findContours(img_temp, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
        # 获取数字矩形轮廓
        x, y, w, h = cv2.boundingRect(cnt[0])
        # 将单个数字区域进行缩放并存到列表中以备后面使用
        digit_roi = cv2.resize(img_temp[y:y+h, x:x+w], (57, 88))
        digits.append(digit_roi)

最后一个函数是程序的重点,实现功能就是识别出数字并输出。

不过这里把这个大函数分开两部分来讲解。

第一部分是对图片进行处理,最终把图片中的数字区域圈出来。

    # 这两个都是核,参数可以改变
    rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    # 这个就是读取图片的,可以暂时不理解
    target_path = now_dir + "\\" + "demo_" + str(index) + ".png"
    img_origin = cv2.imread(target_path)
    # 对图片进行缩放处理
    img_origin = resize(img_origin, width=300)
    # 灰度图
    img_gray = cv2.cvtColor(img_origin, cv2.COLOR_BGR2GRAY)
    # 高斯滤波  参数可以改变,选择效果最好的就可以
    gaussian = cv2.GaussianBlur(img_gray, (5, 5), 1)# 自动二值化处理,黑底白字
    img_temp = cv2.threshold(
        gaussian, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    # 顶帽操作
    img_top = cv2.morphologyEx(img_temp, cv2.MORPH_TOPHAT, rectKernel)
    # sobel操作
    img_sobel_x = cv2.Sobel(img_top, cv2.CV_64F, 1, 0, ksize=7)
    img_sobel_x = cv2.convertScaleAbs(img_sobel_x)
    img_sobel_y = cv2.Sobel(img_top, cv2.CV_64F, 0, 1, ksize=7)
    img_sobel_y = cv2.convertScaleAbs(img_sobel_y)
    img_sobel_xy = cv2.addWeighted(img_sobel_x, 1, img_sobel_y, 1, 0)
    # 闭操作
    img_closed = cv2.morphologyEx(img_sobel_xy, cv2.MORPH_CLOSE, rectKernel)
    # 自动二值化
    thresh = cv2.threshold(
        img_closed, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    # 闭操作
    img_closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)
    # 寻找数字轮廓
    cnts = cv2.findContours(
        img_closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
    # 轮廓排序
    (cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom")
    # 存放正确数字序列(包含逗号)的轮廓,即过滤掉不需要的轮廓
    right_loc = []
    # 下面这个循环是对轮廓进行筛选,只有长宽比例大于2的才可以被添加到列表中
    # 这个比例可以根据具体情况来改变。除此之外,还可以通过轮廓周长和轮廓面积等对轮廓进行筛选
    for c in cnts:
        x, y, w, h = cv2.boundingRect(c)
        ar = w/float(h)
        if ar > 2:
            right_loc.append((x, y, w, h))

部分步骤的效果图:

在这里插入图片描述

可以看到在进行完最后一次闭操作后,一串数字全部变成白色区域,这样再进行轮廓检测就可以框出每一行数字的大致范围,这样就可以缩小数字处理的范围,可以在这些具体的区域内部对单个数字进行处理。

轮廓效果:

在这里插入图片描述

在这样进行以上步骤之后,就可以确定一行数字的范围了,下面就进行轮廓筛选把符合条件的轮廓存入列表。

注意:在代码中使用了(cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom")

这个函数的使用需要导入imutils,这个模块具体使用方法可以浏览我的另一篇博客OpenCV学习笔记

函数的最后一部分就是对每个数字轮廓进行分割,取出单个数字的区域然后进行模板匹配。

for (gx, gy, gw, gh) in right_loc:
        # 用于存放识别到的数字
        digit_out = []
        # 下面两个判断主要是防止出现越界的情况发生,如果发生的话图片读取会出错
        if (gy-10 < 0):
            now_gy = gy
        else:
            now_gy = gy-10
        if (gx - 10 < 0):
            now_gx = gx
        else:
            now_gx = gx-10
        # 选择图片兴趣区域
        img_digit = gaussian[now_gy:gy+gh+10, now_gx:gx+gw+10]
        # 二值化处理
        img_thresh = cv2.threshold(
            img_digit, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        # 寻找所有轮廓 找出每个数字的轮廓(包含逗号) 正确的话应该有9个轮廓
        digitCnts = cv2.findContours(
            img_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
        # 从左到右排列轮廓
        # 这样排列的好处是,正常情况下可以确定逗号的位置方便后面删除逗号
        (cnts, boundingBoxes) = contours.sort_contours(digitCnts, "left-to-right")
        # cnts是元组,需要先转换成列表,因为后面会对元素进行删除处理
        cnts = list(cnts)
        flag = 0
        # 判断轮廓数量是否有9个
        if len(cnts) == 9:
            # 删除逗号位置
            del cnts[1]
            del cnts[2]
            del cnts[3]
            del cnts[4]
            # 可以在转成元组
            cnts = tuple(cnts)
            # 存放单个数字的矩形区域
            num_roi = []
            for c in cnts:
                x, y, w, h = cv2.boundingRect(c)
                num_roi.append((x, y, w, h))
            # 对数字区域进行处理,把尺寸缩放到与数字模板相同
            # 对其进行简单处理,方便与模板匹配,增加匹配率
            for (rx, ry, rw, rh) in num_roi:
                roi = img_digit[ry:ry+rh, rx:rx+rw]
                roi = cv2.resize(roi, (57, 88))
                # 高斯滤波
                roi = cv2.GaussianBlur(roi, (5, 5), 1)
                # 二值化
                roi = cv2.threshold(
                    roi, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
                # 用于存放匹配率
                source = []
                # 遍历数字模板
                for digitROI in digits:
                    # 进行模板匹配
                    res = cv2.matchTemplate(
                        roi, digitROI, cv2.TM_CCOEFF_NORMED)
                    max_val = cv2.minMaxLoc(res)[1]
                    source.append(max_val)
                # 这个需要仔细理解 这个就是把0-9数字中匹配度最高的数字存放到列表中
                digit_out.append(str(source.index(max(source))))
            # 打印最终输出值
            print(digit_out)
        else:
            print("读取失败")
            flag = 1
        # 将数字输出到txt文本中
        t = ''
        with open(now_dir + "\\temp.txt", 'a+') as q:
            if flag == 0:
                for content in digit_out:
                    t = t + str(content) + " "
                q.write(t.strip(" "))
                q.write('\n')
                t = ''
            else:
                q.write("读取失败")
                q.write('\n')

注意理解:digit_out.append(str(source.index(max(source))))

这个是很重要的,列表source存放模板匹配的每个数字的匹配率,求出其中最大值的索引值,因为数字模板是按照0-9排列的,索引source的匹配率也是按照0-9排列的,所以每个元素的索引值就与相匹配的数字相同。这样的话,取得最大值的索引值就相当于取到了匹配率最高的数字。

完整代码

from imutils import contours
import cv2
import os


def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized


def load_digits():
    # 加载数字模板
    path = numbers_address
    filename = os.listdir(path)
    for file in filename:
        # print(file)
        img = cv2.imread(
            numbers_address + "\\" + file)
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img_temp = cv2.threshold(
            img_gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        cnt = cv2.findContours(img_temp, cv2.RETR_EXTERNAL,
                               cv2.CHAIN_APPROX_NONE)[0]
        x, y, w, h = cv2.boundingRect(cnt[0])
        digit_roi = cv2.resize(img_temp[y:y+h, x:x+w], (57, 88))
        # 将数字模板存到列表中
        digits.append(digit_roi)


def demo(index):
    rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    target_path = now_dir + "\\" + "demo_" + str(index) + ".png"
    img_origin = cv2.imread(target_path)
    img_origin = resize(img_origin, width=300)
    img_gray = cv2.cvtColor(img_origin, cv2.COLOR_BGR2GRAY)
    gaussian = cv2.GaussianBlur(img_gray, (5, 5), 1)
    img_temp = cv2.threshold(
        gaussian, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    img_top = cv2.morphologyEx(img_temp, cv2.MORPH_TOPHAT, rectKernel)
    img_sobel_x = cv2.Sobel(img_top, cv2.CV_64F, 1, 0, ksize=7)
    img_sobel_x = cv2.convertScaleAbs(img_sobel_x)
    img_sobel_y = cv2.Sobel(img_top, cv2.CV_64F, 0, 1, ksize=7)
    img_sobel_y = cv2.convertScaleAbs(img_sobel_y)
    img_sobel_xy = cv2.addWeighted(img_sobel_x, 1, img_sobel_y, 1, 0)
    img_closed = cv2.morphologyEx(img_sobel_xy, cv2.MORPH_CLOSE, rectKernel)
    thresh = cv2.threshold(
        img_closed, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    img_closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)
    cnts = cv2.findContours(
        img_closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
    (cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom")
    draw_img = img_origin.copy()
    draw_img = cv2.drawContours(draw_img, cnts, -1, (0, 0, 255), 1)
    cv_show("666", draw_img)

    # 存放正确数字序列(包含逗号)的轮廓,即过滤掉不需要的轮廓
    right_loc = []
    for c in cnts:
        x, y, w, h = cv2.boundingRect(c)
        ar = w/float(h)
        if ar > 2:
            right_loc.append((x, y, w, h))
    for (gx, gy, gw, gh) in right_loc:
        # 用于存放识别到的数字
        digit_out = []
        if (gy-10 < 0):
            now_gy = gy
        else:
            now_gy = gy-10
        if (gx - 10 < 0):
            now_gx = gx
        else:
            now_gx = gx-10
        img_digit = gaussian[now_gy:gy+gh+10, now_gx:gx+gw+10]
        # 二值化处理
        img_thresh = cv2.threshold(
            img_digit, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        # 寻找轮廓 找出每个数字的轮廓(包含逗号) 正确的话应该有9个轮廓
        digitCnts = cv2.findContours(
            img_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
        # 从左到右排列
        (cnts, boundingBoxes) = contours.sort_contours(digitCnts, "left-to-right")
        cnts = list(cnts)
        flag = 0
        if len(cnts) == 9:
            del cnts[1]
            del cnts[2]
            del cnts[3]
            del cnts[4]
            cnts = tuple(cnts)
            num_roi = []
            for c in cnts:
                x, y, w, h = cv2.boundingRect(c)
                num_roi.append((x, y, w, h))
            for (rx, ry, rw, rh) in num_roi:
                roi = img_digit[ry:ry+rh, rx:rx+rw]
                roi = cv2.resize(roi, (57, 88))
                roi = cv2.GaussianBlur(roi, (5, 5), 1)
                roi = cv2.threshold(
                    roi, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
                source = []
                for digitROI in digits:
                    res = cv2.matchTemplate(
                        roi, digitROI, cv2.TM_CCOEFF_NORMED)
                    max_val = cv2.minMaxLoc(res)[1]
                    source.append(max_val)
                digit_out.append(str(source.index(max(source))))
            cv2.rectangle(img_origin, (gx-5, gy-5),
                          (gx+gw+5, gy+gh+5), (0, 0, 255), 1)
            print(digit_out)
        else:
            print("读取失败")
            flag = 1
        t = ''
        with open(now_dir + "\\temp.txt", 'a+') as q:
            if flag == 0:
                for content in digit_out:
                    t = t + str(content) + " "
                q.write(t.strip(" "))
                q.write('\n')
                t = ''
            else:
                q.write("读取失败")
                q.write('\n')


if __name__ == "__main__":
    # 存放数字模板列表
    digits = []
    # 当前运行目录
    now_dir = os.getcwd()
    print("当前运行目录:" + now_dir)
    numbers_address = now_dir + "\\numbers"
    load_digits()
    times = input("请输入程序运行次数:")
    for i in range(1, int(times) + 1):
        demo(i)
    print("输出成功,请检查本地temp.txt文件")
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    while True:
        if input("输入小写‘q’并回车退出") == 'q':
            break

整个文件下载地址:点我下载

注意:如果想同时识别多个图片话,需要将图片统一改名为“demo_ + 数字序号.png” 例如:demo_1.png demo_2.png 同时在运行代码时输入图片个数即可。

总结

这个程序代码相对来说不算复杂,主要是对图像的一些基础处理需要注意。因为不同的图像想要识别成功需要进行不同程度的基础处理,所以在做的时候可以多输出几张图片检查一下那一步效果不太好并及时进行修改调整,这样才能达到最终比较好的效果。

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

OpenCV模板匹配识别图片中的数字 的相关文章

  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • Android for OpenCV - 打开跟踪文件时出错,UnsatisfiedLinkError

    我对 Android 开发和 OpenCV 都是新手 我从 Android 下载了 OpenCV 库http sourceforge net projects opencvlibrary files opencv android http
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 从凸点获取角点

    我编写了算法来提取图像中显示的点 它们形成凸形 我知道它们的顺序 如何从这些点中提取角点 顶部 3 个和底部 3 个 我正在使用opencv 如果你已经有了物体的凸包 并且该包包含角点 那么你需要做的就是简化包直到它只有 6 个点 有很多方
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • OpenCv 与 Android studio 1.3+ 使用新的 gradle - 未定义的参考

    我在使用原生 OpenCv 2 4 11 3 0 0 也可以 和 Android Studio 1 3 以及新的 ndk 支持时遇到问题 所有关于 mk 文件的教程 但我想将它与新的实验性 gradle 一起使用 使用 Kiran 答案An
  • opencv - 在图像中绘制轮廓

    我正在尝试在图像周围绘制轮廓 我可以看到找到了轮廓 但无法绘制轮廓 轮廓的颜色似乎是两种 黑色和白色 颜色中的一种 import cv2 import numpy as np import matplotlib pyplot as plt
  • OpenCV:RGB 到 YUV 转换,并显示维基百科等通道

    我一直在寻找这种转换有一段时间了 在Linux上使用Python将RGB图像转换为YUV图像并访问Y U和V通道有哪些方法 使用 opencv skimage 等 更新 我用的是opencv img yuv cv2 cvtColor ima
  • 如何填充接触图像边框的轮廓?

    假设我有以下从输出创建的二进制图像cv watershed 现在我想找到并填充轮廓 这样我就可以将相应的对象与原始图像中的背景 由分水岭函数分割 分开 为了分割图像并找到轮廓 我使用下面的代码 cv Mat bgr cv imread te
  • 从图像中提取特定文本关联值

    我有一个图像 我想从图像中提取键和值对的详细信息 例如 我想提取 MASTER AIRWAYBILL NO 的值 我已编写使用 python opencv 和 OCR 从图像中提取整个文本 但我不知道如何从图像的整个结果文本中仅提取 MAS
  • opencv潜在支持向量机[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用基于部件的模型进行对象分类
  • 如何在不使用OpenCV Python中的split函数的情况下获取图像的单一颜色通道?

    我想强调一下用于实时手势识别的手 我观察到 使用 cv2 imsplit 函数 手的图像对于不同的颜色通道会以不同的方式突出显示 但这种分割功能在时间上是非常昂贵的 我无法使用 Numpy 索引执行相同的功能 如官方网站 https doc
  • 将曲线图案与图像边缘匹配

    我有一个要搜索沿其边缘的曲线的目标图像和一个包含该曲线的模板图像 我需要实现的是在目标图像中找到模板图像中的曲线的最佳匹配 并根据分数来判断是否匹配 这还包括曲线的旋转和大小调整 目标图像可以是 Canny Edge 检测器的输出 如果这能
  • OpenCV argc 和 argv 混淆

    我正在检查一些 OpenCV 教程 并在开头找到了这一行 这是链接 代码位于 CalcHist 部分下http opencv willowgarage com documentation c histograms html http ope
  • 使用 openCV 检测 ROI

    我正在做一项工作 我必须找到感兴趣的区域 ROI 然后对图像执行阈值 由于我不是计算机领域的 所以我遇到了一些困难 我开始尝试通过以下代码找到投资回报率 code string filename 2011 06 11 09 3A12 3A1
  • python - opencv - 将像素从 bgr 转换为 hsv

    img cv2 imread example jpg img hsv cv2 cvtColor img cv2 COLOR BGR2HSV lower mask 0 10 lower red np array 0 50 50 upper r
  • ndk-build error.opencv2/core/core.hpp:没有这样的文件或目录

    我在 Android 中使用 OpenCV Nonfree 模块时遇到问题 我读了这个教程https sites google com site wghsite technical notes sift surf opencv androi
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra

随机推荐

  • 初识c语言的条件判断和循环。

    刚开始接触c语言的循环 xff0c 也许你会烦躁 xff0c 但是你只需要静下心来再看一遍 xff0c 你就会有更多的收获 xff0c 加油 xff01 xff08 凡事开头难 xff0c 迈过第一关 xff0c 你就是最棒的 xff01
  • digest鉴权

    摘要 式认证 xff08 Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为HTTP协议开发的 xff0c 因而也常叫做HTTP摘要 xff0c 在RFC2671中描述 其身份验证机制很简单
  • 超长整型除法运算

    1017 A除以B 20分 本题要求计算 A B xff0c 其中 A 是不超过 1000 位的正整数 xff0c B 是 1 位正整数 你需要输出商数 Q 和余数 R xff0c 使得 A 61 B Q 43 R 成立 输入格式 xff1
  • 练习2-11 计算分段函数[2] (10分)

    本题目要求计算下列分段函数f x 的值 xff1a f2 11 注 xff1a 可在头文件中包含math h xff0c 并调用sqrt函数求平方根 xff0c 调用pow函数求幂 输入格式 输入在一行中给出实数x 输出格式 在一行中按 f
  • 习题4-2 求幂级数展开的部分和 (20分)

    已知函数e x可以展开为幂级数1 43 x 43 x 2 2 43 x 3 3 43 43 x k k 43 现给定一个实数x xff0c 要求利用此幂级数部分和求e x 的近似值 xff0c 求和一直继续到最后一项的绝对值小于0 0000
  • 练习7-10 查找指定字符 (15分)

    本题要求编写程序 xff0c 从给定字符串中查找某指定的字符 输入格式 xff1a 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 xff08 不超过80个字符 xff09 输出格式 xff1a 如果找到 xff0c 在
  • 习题9-5 通讯录排序 (20分)

    输入n个朋友的信息 xff0c 包括姓名 生日 电话号码 xff0c 本题要求编写程序 xff0c 按照年龄从大到小的顺序依次输出通讯录 题目保证所有人的生日均不相同 输入格式 输入第一行给出正整数n xff08 lt 10 xff09 随
  • C++提高运行速度

    ios base span class token punctuation span span class token punctuation span span class token function sync with stdio s
  • Java小项目(功能齐全)-停车场管理系统(中英文版)

    一 项目目的 xff1a 停车场管理系统 对停车场进行更系统的管理 xff0c 使整个过程更加高效有序 二 主要功能 xff1a 1 进入停车场 2 离开停车场 3 搜索信息 4 停车场当前车位明细查询 5 历史查询 三 附加功能 xff1
  • 应用YOLOV4 - DeepSort 实现目标跟踪

    转载自 https cloud tencent com developer article 1706259 本文分享利用yolov4 43 deepsort实现目标跟踪 xff0c 主要是讲解如何使用 xff0c 具体原理可以根据文中的参考
  • C++ char* 字符串处理、数组指针及传参

    编写函数 xff0c 将一个字符串 str 中指定的字符 ch 删去 xff08 包括重复出现的字符 xff09 xff0c 并编写主函 数进行调用测试 函数原型 void delchar char str char ch 输入 xff1a
  • STM32芯片写保护/解除写保护的方法

    一 写保护 1 目的 将Flash设置为写保护的目的 xff0c 是为了防止其他人通过J Link xff0c ULINK2等仿真器 xff0c 将Flash中的程序读取出来 设想一下 xff0c 你辛辛苦苦研发的产品 xff0c 别人通过
  • RG401 4G数传配置

    LP RG401为乐朴智能研发的一款4G无线数传模块 xff0c 支持接入移动 电信 联通运营商网络 xff0c 并且可以实现 3G 网络与 4G 网络之间的无缝切换 模块在运营商网络覆盖范围内可以实现点对点 一对多 多对多组网的不限距离数
  • 直流无刷电机与空心杯电机的区别

    浏览数 xff1a 132 日期 xff1a 2011 8 15 8 43 03 小 中 大 关闭注释 显示注释 直流无刷电机与空心杯电机的区别 空心杯电机CORELESS MOTOR xff0c 也叫无铁芯电机 xff0c 顾名思义 xf
  • 摘要认证

    1 摘要认证的改进 1 1 用摘要保护密码 摘要认证遵循 绝不通过网络发送密码 客户端发送一个 指纹 或者密码的 摘要 xff0c 是密码的不可逆扰码 1 2 单向摘要 z还要是对信息主体的浓缩 摘要是一个单向函数 xff0c 主要是将无线
  • 4路红外循迹模块使用教程

    4路红外循迹模块使用教程 文章目录 4路红外循迹模块使用教程模块详细信息 xff1a 模块接线模块使用相关代码 个人原创博客 xff1a 点击浏览 模块详细信息 xff1a 工作电压 xff1a DC 3 3V 5V 工作电流 xff1a
  • 循迹智能小车 循黑线 智能小车 红外循迹传感器 单片机

    循迹智能小车 循黑线 文章目录 循迹智能小车 循黑线硬件菜单硬件使用硬件组装程序设计前的理解程序代码 个人原创博客 xff1a 点我浏览 硬件菜单 单片机型号 xff1a STC16F40K128 4路红外循迹模块 小车底盘套件 xff08
  • 树莓派使用USB串口通信 CH340

    树莓派使用USB串口通信 CH340 个人博客原址 xff1a 树莓派使用USB串口通信 CH340 因为需要使用树莓派做自控方向的东西 xff0c 所以需要使用树莓派串口与各种外设进行通信 使用串口的话个人比较喜欢直接使用USB串口 xf
  • Python+OpenCV颜色识别 物体追踪

    Python 43 OpenCV颜色识别 物体追踪 对于颜色识别和imutils包的用法请浏览我得另一篇博客 xff1a OpenCV学习笔记 文章目录 Python 43 OpenCV颜色识别 物体追踪代码原理代码最终效果图 个人博客原址
  • OpenCV模板匹配识别图片中的数字

    OpenCV模板匹配识别图片中的数字 前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字 xff0c 然后把识别出来的数字输出到txt文件中 xff0c 如果识别失败则输出 读取失败 操作环境 xff1a OpenCV 4 1