yolov5的二次开发以及目标缺陷检测项目(二)补充

本文详细解释了如何在yolov5的检测结果基础上,通过读取txt文件并利用ROI.extract_roi接口提取图像中的目标区域,同时提到了txt文件的生成方法和ROI区域裁剪的实现。后续还将涉及http服务端和客户端的开发。
摘要由CSDN通过智能技术生成

        yolov5的二次开发以及目标缺陷检测项目,对上篇文章的补充如下:

一、关于txt = readloadPath.parseTxt("156.txt")代码的解析及源码如下:

        本意是将yolov5检测的结果以txt文件的形式保存下来,然后在图像后处理过程中直接通过一张原图和输出的txt文件,将检测目标从原图上扣下来,也就是上文说的ROI区域,然后再对ROI图像进行图像处理,以及判断操作。

        在yolov5进行detect的过程中,通过使用一下命令,输出txt文件:

        python detect.py --weights yolov5s.pt --source data/images --save-txt

readloadPath.py代码如下:

import os
import glob
import cv2
# 获取当前文件所在目录的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 获取上上级目录
root_dir = os.path.abspath(os.path.join(current_dir, "../../"))

def refresh_current_directory():
    current_dir = os.getcwd()
    os.chdir(current_dir)


class parseTxt:
    def __init__(self, str):
        self.str = "labels/" + str
    def getTxt(self):
        folder_path = os.path.join(root_dir, "yolov5/runs/detect/")
        # 拼接通配符路径,匹配文件夹
        subfolders = glob.glob(os.path.join(folder_path, "exp*"))
        if len(subfolders) == 0:
            print("No matching subfolders found.")
            exit()
        refresh_current_directory()
        # 排序文件夹,按修改时间降序排列
        sorted_subfolders = sorted(subfolders, key=lambda x: os.path.getmtime(x), reverse=True)

        # 获取最后一个文件夹路径
        last_subfolder = sorted_subfolders[0]
        # 打印最后一个文件夹路径
        # print("last road is :", last_subfolder)
        path = os.path.join(last_subfolder, self.str)  # 修改对应文件
        return path

def getFileRoad():
    folder_path = os.path.join(root_dir, "yolov5/runs/detect/")
    # 拼接通配符路径,匹配文件夹
    subfolders = glob.glob(os.path.join(folder_path, "exp*"))
    if len(subfolders) == 0:
        print("No matching subfolders found.")
        exit()
    refresh_current_directory()
    # 排序文件夹,按修改时间降序排列
    sorted_subfolders = sorted(subfolders, key=lambda x: os.path.getmtime(x), reverse=True)

    # 获取最后一个文件夹路径
    last_subfolder = sorted_subfolders[0]
    # 打印最后一个文件夹路径
    # print("last road is :", last_subfolder)
    # path = os.path.join(last_subfolder, self.str)  # 修改对应文件
    return last_subfolder

if __name__ == "__main__":
    pT = parseTxt("156.txt")
    print(pT.getTxt())

        上述代码主要是detect很多次以后会生成很多个检测的文件夹,根据文件夹生成时间进行排序,从而获取最新更新或生成的文件夹路径,从而获取最新检测的一批图像检测后的txt文件。

二、关于ROI.extract_roi(img_ori, values)接口说明

        就是以上说的ROI区域提取,如何根据输出的txt文件,将原图中对应目标的ROI区域裁剪出来。

import roiRelatedOperations as ROI

roiRelatedOperations.py源码如下:

import cv2
import numpy as np
import os
import sys
import Tools as rt
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(current_dir, "."))
import readloadPath

def draw_roi(image_path, start_x, start_y, end_x, end_y):
    # 读取图像
    image = cv2.imread(image_path)
    # 绘制ROI区域
    color = (0, 255, 0)  # 框的颜色,这里使用绿色 (B, G, R)
    thickness = 2       # 框的线宽
    cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color, thickness)
    # 显示图像
    cv2.imshow("Image with ROI", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def extract_roi(img, values):
    height, width, channels = img.shape
    centry_x = values[1]
    centry_y = values[2]
    width_data = values[3] / 2
    height_data = values[4] / 2
    x0 = int(width * (centry_x - width_data))
    y0 = int(height * (centry_y - height_data))
    x1 = int(width * (centry_x + width_data))
    y1 = int(height * (centry_y + height_data))
    roi = img[y0:y1, x0:x1]
    return roi

if __name__ == "__main__":
    # 0 0.356662 0.21647 0.31512 0.236588 screen
    img_path = "../../testDataset/156.jpg"
    image = cv2.imread(img_path)
    height, width, channels = image.shape
    print("images size is : ", image.shape)                 # h, w, c

    # file_path = '../exp6/labels/156.txt'  # 文件路径
    txt = readloadPath.parseTxt("156.txt")
    path = txt.getTxt()

    rT = rt.readTxt(path, 0)
    values = rT.open_file()
    centry_x = values[1]
    centry_y = values[2]
    width_data = values[3]/2
    height_data = values[4]/2
    x0 = int(width*(centry_x - width_data))
    y0 = int(height*(centry_y - height_data))
    x1 = int(width*(centry_x + width_data))
    y1 = int(height*(centry_y + height_data))
    print("x0 :", x0)
    print("y0 :", y0)
    print("x1 :", x1)
    print("y1 :", y1)

    roi = image[y0:y1, x0:x1]
    # draw_roi(path, x0, y0, x1, y1)
    cv2.imshow("ROI", roi)
    cv2.imwrite("./roi.jpg", roi)
    # print("ROI shape :", roi.shape)
    # 制造黑色区域
    mask = np.zeros_like(roi)
    startPoint = (200, 150)
    endPoint = (300, 250)
    # roi[startPoint[1]:endPoint[1], startPoint[0]:endPoint[0]] = [0,0,0]
    # cv2.imshow("roi", roi)
    cv2.waitKey(0)
    cv2.destroyAllWindows()




        以上代码可以修改图像路径和txt文件路径,就可以直接进行测试,测试例子也已经放在源码中了。

        本项目有空后续还会持续更新补充,包括后续http服务端和客户端,如有问题可以在评论区留言,一起探讨!

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值