有点无聊3 2024-05-04 16:02 采纳率: 54.5%
浏览 11
已结题

yolov8obb&opencv

使用此代码运行完全部视频后TAR文件夹中只存了五张图片,远少于实际目标数量

import time
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import save_one_box as crop
import imutils
import numpy as np
import os
import shutil

model = YOLO('best.pt')

video_path = "D:/WIN_20230907_21_08_23_Pro.mp4"
cap = cv2.VideoCapture(video_path)
confi = 0.2

if not os.path.exists('TAR'):
    os.mkdir('TAR')

while cap.isOpened():
    success, frame = cap.read()

    confi = round(confi, 2)
    if confi <= 0.2:
        confi = 0.2
    elif confi >= 0.8:
        confi = 0.8

    if success:
        Results = model(frame, conf=confi, save=False, show=False)
        annotated_frame = Results[0].plot()
        cv2.imshow("YOLOv8 Tracking", annotated_frame)
        r = Results[0]
        ori_h, ori_w = r.orig_shape

        if Results:
            obbs = r.obb.xywhr.tolist()
            for i, obb in enumerate(obbs):
                xc, yc, w, h, angle = obb
                print(xc, yc, w, h, angle)

                roM = cv2.getRotationMatrix2D((xc, yc), angle, 1)
                ro_frame = cv2.warpAffine(frame, roM, (ori_w, ori_h))
                cropped_frame = cv2.getRectSubPix(ro_frame, (int(w), int(h)), (xc, yc))
                filename = f"TAR/cropped_{i}.jpg"
                cv2.imwrite(filename, cropped_frame)
        else:
            bkg = np.ones((256, 1280, 3), dtype=np.uint8)
            bkg *= 200
            annotated_frame = np.vstack((annotated_frame, bkg))

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

    # Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

  • 写回答

5条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    根据代码中注释的内容,该代码主要是使用YOLOv8物体检测模型对视频中的目标进行检测和跟踪,并保存特定目标的裁剪图像。但是,使用该代码运行完全部视频后,TAR文件夹中只存了五张图片,远少于实际目标数量。

    解决方案:

    1.检查代码中的阈值(confi)设置。可以尝试使用不同的阈值进行测试,以获取更多的目标图像文件。

    2.检查代码中的模型加载是否成功。将model(frame, conf=confi, save=False, show=False)返回的Results对象进行打印并检查是否存在检测到的目标。

    3.当前代码仅输出第一个标签的检测结果(Results [0])。可以尝试更改代码以输出更多标签的检测结果并检查是否有更多的裁剪图像文件。例如,可以在"for"循环中打开注释代码,同时保存其他标签的检测结果。

    # res = Results.xyxy[Results.pred[:, -1] != 0]  # XYXY, cls label == 0 by default
    # for *xyxy, conf, cls in reversed(res):
    #     c = int(cls)  # integer class
    #     label = None if c == 0 else model.names[c]  # apply a label
    #     plot_xyxy(image, [xyxy], None, colors[c], label, line_thickness=hyp['thickness'])
    

    4.更改代码中的保存文件名格式,以避免因重复命名而覆盖文件。例如,将文件名更改为在上传时间添加一个时间戳,可以避免出现同名文件。

    5.检查代码中的图像分辨率是否正确。根据目标的绝对坐标中心(即 x,y 坐标)来裁剪图像时,需要将旋转之后的图像坐标系与原始帧对齐。如果未对图像和目标尺寸进行修正,可能会导致计算的目标位置偏离实际位置。

    6.对于检测到的目标,可以通过使用cv2.imwrite函数将其保存在本地。或者可以将目标的原始帧保存下来,以保存完整的目标信息,而不仅仅是裁剪后的部分。

    修改后的代码如下。修改后的代码将识别到的所有目标都保存在本地:

    import time
    import cv2
    from ultralytics import YOLO
    from ultralytics.utils.plotting import save_one_box as crop
    import imutils
    import numpy as np
    import os
    import shutil
    
    model = YOLO('best.pt')
    
    video_path = "D:/WIN_20230907_21_08_23_Pro.mp4"
    cap = cv2.VideoCapture(video_path)
    confi = 0.2
    
    if not os.path.exists('TAR'):
        os.mkdir('TAR')
    if not os.path.exists('all_objects'):
        os.mkdir('all_objects')
    
    while cap.isOpened():
        success, frame = cap.read()
    
        confi = round(confi, 2)
        if confi <= 0.2:
            confi = 0.2
        elif confi >= 0.8:
            confi = 0.8
    
        if success:
            Results = model(frame, conf=confi, save=False, show=False)
            annotated_frame = Results[0].plot()
            cv2.imshow("YOLOv8 Tracking", annotated_frame)
            if Results:
                for i, r in enumerate(Results):
                    obbs = r.obb.xywhr.tolist()
                    ori_h, ori_w = r.orig_shape
                    for obb in obbs:
                        xc, yc, w, h, angle = obb
                        roM = cv2.getRotationMatrix2D((xc, yc), angle, 1)
                        ro_frame = cv2.warpAffine(frame, roM, (ori_w, ori_h))
                        cropped_frame = cv2.getRectSubPix(ro_frame, (int(w), int(h)), (xc, yc))
                        timestamp = time.strftime("%Y%m%d-%H%M%S")
                        filename = f"TAR/image_{timestamp}_{i}.jpg"
                        cv2.imwrite(filename, cropped_frame)
                        all_filename = f"all_objects/image_{timestamp}_{i}_{h}_{w}_{xc}_{yc}.jpg"
                        cv2.imwrite(all_filename, frame)
            else:
                bkg = np.ones((256, 1280, 3), dtype=np.uint8)
                bkg *= 200
                annotated_frame = np.vstack((annotated_frame, bkg))
    
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
        else:
            # Break the loop if the end of the video is reached
            break
    
        # Release the video capture object and close the display window
    cap.release()
    cv2.destroyAllWindows()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月4日

悬赏问题

  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了