Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)

简介: 本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。

背景

如果我们想要根据json标注文件,获取里面的指定目标的裁剪区域,那么我们可以根据以下代码来实现(也可以校验标注情况)。

代码

from tqdm import tqdm
import os, json, cv2, copy
import numpy as np

def get_all_images(path, flags):
    result_list, filenames = [], []
    for root, dirs, files in os.walk(path):
        for file in files:
            filename, file_extension = os.path.splitext(file)
            if file_extension.lower() in flags:
                result_list.append(os.path.join(root, file))
                filenames.append(file)
    return result_list, filenames

def get_labelme_info(label_file, target):
    anno = json.load(open(label_file, "r", encoding="utf-8"))
    shapes = anno['shapes']
    image_path = os.path.basename(anno['imagePath'])
    labels = []
    boxes = []
    for s in shapes:
        pts = s['points']
        x1, y1 = pts[0]
        x2, y2 = pts[1]
        label = s['label']
        if label in target:
            labels.append(label)
            boxes.append([x1, y1, x2, y2])
    return image_path, boxes, labels

def plot_one_ori(image, boxs, label, color, mask_alpha=0.4):
    [x1, y1, x2, y2] = boxs
    mask_img = copy.deepcopy(image) # 1
    ori_img = copy.deepcopy(mask_img) # 1
    cropped_image = ori_img[y1:y2, x1:x2]
    img_height, img_width = image.shape[:2]
    size = min([img_height, img_width]) * 0.0006
    text_thickness = int(min([img_height, img_width]) * 0.001)
    cv2.rectangle(image, (x1, y1), (x2, y2), color, 3)
    caption = f'{"原标签-"}{label}'
    (tw, th), _ = cv2.getTextSize(text=caption, fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                                fontScale=size, thickness=text_thickness)
    th = int(th * 1.2)
    cv2.rectangle(image, (x1, y2),
                (x1 + tw, y2 + th), color, -1)
    cv2.rectangle(mask_img, (x1, y2),
                (x1 + tw, y2 + th), color, -1)
    cv2.putText(image, caption, (x1, y2 + th), cv2.FONT_HERSHEY_SIMPLEX, size, (255, 255, 255), text_thickness, cv2.LINE_AA)
    cv2.putText(mask_img, caption, (x1, y2 + th), cv2.FONT_HERSHEY_SIMPLEX, size, (255, 255, 255), text_thickness, cv2.LINE_AA)
    image = cv2.addWeighted(mask_img, mask_alpha, image, 1 - mask_alpha, 0)
    return image, cropped_image

def cv_imread(filePath):
    cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), flags=cv2.IMREAD_COLOR)
    return cv_img

if __name__ == "__main__":
    img_folder = r"\\DSJ_NAS_90*******" # 原图和JSON文件位置
    save_target_path = r"\\DSJ_NA************" # 保存位置
    target = ["red_face"] # 获取指定目标,可传多个
    os.makedirs(save_target_path, exist_ok=True)
    img_list, filenames = get_all_images(img_folder, flags=[".jpg", ".png", ".jpeg"])
    print(filenames)
    for filename in filenames:
        fn, file_extension = os.path.splitext(filename)
        image_path = os.path.join(img_folder, filename)  # 图片名
        json_path = os.path.join(img_folder, "{}.json".format(fn))  # 标签文件名
        save_path = os.path.join(save_target_path, "{}.jpg".format(fn))
        _, ori_boxes, ori_labels = get_labelme_info(json_path, target)
        for box, label in zip(ori_boxes, ori_labels):
            x1, y1, x2, y2 = list(map(int, box))
            image = cv_imread(image_path)
            image, crop_image = plot_one_ori(image, [x1, y1, x2, y2], label, color=(0,0,255))
            # cv2.imshow("1",crop_image)
            # cv2.waitKey(1)
            cv2.imencode('.jpg', crop_image)[1].tofile(save_path)
目录
相关文章
|
9天前
|
JSON 算法 vr&ar
目标检测笔记(五):查看通过COCOEvaluator生成的coco_instances_results.json文件的详细检测信息,包含AP、AR、MR和DR等
本文介绍了如何使用COCO评估器通过Detectron2库对目标检测模型进行性能评估,生成coco_instances_results.json文件,并利用pycocotools解析该文件以计算AP、AR、MR和DR等关键指标。
27 1
目标检测笔记(五):查看通过COCOEvaluator生成的coco_instances_results.json文件的详细检测信息,包含AP、AR、MR和DR等
|
9天前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
42 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
9天前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
22 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
9天前
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
14 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
9天前
|
缓存 监控 计算机视觉
视频监控笔记(三):opencv结合ffmpeg获取rtsp摄像头相关信息
本文介绍了如何使用OpenCV结合FFmpeg获取RTSP摄像头信息,包括网络架构、视频监控系统组成、以及如何读取和显示网络摄像头视频流。
25 1
|
9天前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
22 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
9天前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
27 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
11天前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
107 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
1月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
39 4
|
29天前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制