yolo V8训练 长条状目标

news2024/11/22 22:11:22

1、说明

目标数据集合中有很多长条状图片,如果直接Resize 会严重拉伸,因此采用把长条图像裁剪成2段,然后将裁剪后的2段图片拼接在一起。

2、代码

2.1 C++ 代码 (部署,模型推理时C++ )

#include <stdio.h>
#include<string>
#include <vector>
#include <sys/stat.h>
#include<opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>  
using namespace std;
using namespace cv;
int main()
{
	cv::Mat img = cv::imread("_1.jpg", 1);
	cv::Mat dst;
	int src_h = img.rows;  
	int	src_w = img.cols;
	std::cout << "src_h " << img.rows << std::endl;
	std::cout << "src_w " << img.cols << std::endl;
	if (src_h > src_w && src_h > 600)
	{
		int dst_h = int(src_h / 2) + 16;
		int dst_w = src_w * 2;
		cv::Mat blank(dst_h, dst_w, CV_8UC3, cv::Scalar(0, 0, 0));
		cv::Mat blank_1 = blank(cv::Rect(0, 0, src_w, dst_h));
		cv::Mat blank_2 = blank(cv::Rect(src_w - 1, 0, src_w, dst_h - 16));
		blank_1 += img(cv::Rect(0, 0, src_w, dst_h));
		blank_2 += img(cv::Rect(0, dst_h - 16 - 1, src_w, dst_h - 16));
		dst = blank.clone();
	}
	else if (src_w > 600 && src_h > 100)
	{
		int dst_h = src_h * 2;                    // 566*2      = 1332
		int dst_w = int(src_w / 2) + 16;              // 1658/2 +16 = 845
		cv::Mat blank(dst_h, dst_w, CV_8UC3, cv::Scalar(0, 0, 0));
		cv::Mat blank_1 = blank(cv::Rect(0, 0, dst_w, src_h));
		cv::Mat blank_2 = blank(cv::Rect(0, src_h - 1, dst_w - 16, src_h));
		blank_1 += img(cv::Rect(0, 0, dst_w, src_h));
		blank_2 += img(cv::Rect(dst_w - 16 - 1, 0, dst_w - 16, src_h));
		dst = blank.clone();
	}
	std::cout << "dst_h " << img.rows << std::endl;
	std::cout << "dst_w " << img.cols << std::endl;
	cv::imshow("src", img);
	cv::imshow("dst", dst);
	cv::waitKey(0);
}

2.2 python 代码(训练时处理数据)

import os
import numpy as np
import copy
import shutil
import cv2

def cv_imread(file_path):
    #imdedcode读取的是RGB图像
    cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)
    return cv_img


src_path_root = "E:/trip/"
dst_path_root = "E:/strip_combine/"
images_names=os.listdir(src_path_root)
print(images_names)
print("图片张数:",len(images_names))
for img_name in images_names:
    image_path = src_path_root+img_name
    print(image_path)
    print(img_name[-4:])
    if img_name[-4:] != "json":
        img = cv_imread(image_path)
        cv2.imshow("img",img)

        print(img.shape)
        shape0 = img.shape[0]
        shape1 = img.shape[1]
        img_height = shape0
        img_width = shape1
        image_save_path = dst_path_root + img_name
        if img_height > img_width:
            # 使用zeros()方法创建图像对象
            src_h, src_w, c = img.shape
            dst_h = int(src_h/2)+16
            dst_w = src_w * 2
            blank = np.zeros((dst_h, dst_w, c), dtype=np.uint8)
            blank[0:dst_h, 0:src_w, :] = img[0:dst_h, 0:src_w, :]
            blank[0:dst_h-16:, src_w:2*src_w, :] = img[dst_h-16:2*dst_h-32, 0:src_w, :]
            cv2.imshow('blank', blank)
            cv2.imwrite(image_save_path, blank)
            cv2.waitKey(10)
        if img_height < img_width:
            # 使用zeros()方法创建图像对象
            src_h, src_w, c = img.shape
            dst_w = int(src_w/2)+16
            dst_h = src_h*2
            blank = np.zeros((dst_h, dst_w, c), dtype=np.uint8)
            blank[0:src_h, 0:dst_w, :] = img[0:src_h, 0:dst_w, :]
            blank[src_h:2*src_h, 0:dst_w-16:, :] = img[0:src_h, dst_w-16:2*dst_w-32, :]
            cv2.imshow('blank', blank)
            cv2.imwrite(image_save_path, blank)
            cv2.waitKey(10)

3 附一张效果图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

讯飞星火极速超拟人交互技术:语音端到端,8 月底开放;昆仑万维发布 AI 短剧平台 SkyReels丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Linux驱动开发基础(中断)

所学来自百问网 目录 1. 嵌入式中断系统 2. 中断处理流程 3. 异常向量表 4. Linux系统对中断的处理 4.1 ARM 处理器程序运行的过程 4.2 保护现场 5. Linux 系统对中断处理的演进 5.1 硬件中断和软件中断 5.2 中断拆分(上半部和下半部) 5.2.1 tasklet 5.2.2 工作队列…

iPad协议08算法新版

iPad协议是一种模拟iPad端微信的人工操作&#xff0c;并与微信服务器进行通信的协议。该协议涉及到一些关键点&#xff0c;包括PB协议、mmtls、07加密算法、rqt算法、aes加密、rsa加密等。只要理解了这些关键点&#xff0c;就可以模拟官方微信的所有功能&#xff0c;并且还可以…

基于STM32开发的智能家用能源管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化能源监测与数据处理能源管理与控制Wi-Fi通信与远程监控应用场景 家庭能源使用优化智能电力监控常见问题及解决方案 常见问题解决方案结论 1. 引言 随着能源需求的不断增长和环境保…

redis随笔记

缓存穿透。key不存在。恶意攻击、代码问题。加布隆过滤器&#xff0c;或者为空就返回。 缓存失效&#xff08;击穿&#xff09;。key刚好过期。缓存时间随机数。 缓存雪崩。缓存层宕机&#xff0c;一下子袭击数据库。缓存高可用、限流熔断、提前演练。 布隆过滤器就是一个key…

文档透明加密软件是什么?有哪些功能?一文给您详解!

文档透明加密软件是一种在不影响用户正常操作习惯的前提下&#xff0c;自动对电子文档进行加密和解密的技术解决方案。 其核心特点在于“透明性”&#xff0c;即用户在打开、编辑或保存文档时&#xff0c;无需进行任何额外的加密或解密操作&#xff0c;这些过程均在系统后台自…

【深度学习】【多模态】使用MiniCPM-V 2.6进行图片OCR

文章目录 ocr评价ocr 下载项目:https://huggingface.co/openbmb/MiniCPM-V-2_6 准备一个图片’test.jpg’。 将下面的python中的目录地址换成MiniCPM-V-2_6项目所在地址。然后执行: # test.py import torch from PIL import Image from transformers import AutoModel, Aut…

网络主播被正式认定为国家新职业

网络主播这一职业正式获得国家认可&#xff0c;标志着这一工作已成为一项正当且受认可的职业&#xff0c;而不再只是灵活就业的选项。近日&#xff0c;人力资源和社会保障部公布了新增的19个新职业信息&#xff0c;其中包括网络主播。对于从事直播行业的人来说&#xff0c;这是…

zabbix实战-磁盘空间告警

1.创建监控项 选择&#xff1a;键值&#xff1a;vfs.fs.size[fs,<mode>] 。 直接写 vfs.fs.size[fs,<mode>]是不出数据的。我们要写具体的值 &#xff1a;vfs.fs.size[/,free] &#xff0c;这个表示查看根的剩余空间。 2.创建图形 为磁盘剩余空间监控项创建图形&am…

cdn刷新预热

1、访问 cdn 控制台的 刷新预热 页面&#xff0c;填写需要刷新预热的url地址 阿里云&#xff1a; 腾讯云&#xff1a; 2、通过调用cdn的api接口刷新预热 阿里云&#xff1a; 调用RefreshObjectCaches-刷新缓存_CDN(CDN)-阿里云帮助中心 调用PushObjectCache-预热URL_CDN(CD…

前端宝典九:React Native从入门到精通实战

本文主要介绍 React Native新旧框架对比React与React Native区别React Native性能优化 其中第3点React Native性能优化的拆包分包&#xff0c;是项目实战中使用过的&#xff0c;在这里整理分享&#xff0c;如果没有用过的小伙伴会觉得晦涩难懂&#xff0c;建议按照在实际项目…

【等保测评】IIS模拟测评

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 结果记录&#xff1a;此项不适用&#xff0c;IIS中间件无管理控制台&#xff0c;身份鉴别功能依赖于所部署的服务器 b)应具有…

计算机毕业设计 心理健康服务系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

创新驱动发展,SiLM5768LCG-DG 支持输入输出同相逻辑 带互锁功能的六通道数字隔离器 科技稳健赋能,工业汽车应用安全升级!

SiLM5768Lx系列带互锁功能的六通道数字隔离器选型表: SiLM5768LCG-DG:支持输入输出同相逻辑 SiLM5768LNCG-DG:支持输入输出反相逻辑 数字隔离器广泛应用于工业、汽车和通信等领域&#xff0c;为系统中的强电和弱电电路提供了安全、可靠的电气隔离解决方案&#xff0c;确保强…

【TCP】核心机制:延时应答、捎带应答和面向字节流

文章目录 延时应答捎带应答面向字节流粘包问题方案一&#xff1a;指定分隔符方案二&#xff1a;指定数据的长度 TCP 报头首部长度保留&#xff08;6 位&#xff09;选项序号确认序号 延时应答 尽可能降低可靠传输带来的性能影响 提升性能>让滑动窗口变大 如果我们立即返回 …

Chat App 项目之解析(二)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

Docker最佳实践进阶(二):Docker Compose部署SpringCloud微服务项目

大家好&#xff0c;在上篇文章中博主演示了Dockerfile常用的命令&#xff0c;以及如何利用Dockerfile构建镜像&#xff0c;生成容器服务&#xff0c;但是在实际应用环境中&#xff0c;特别是在微服务架构中&#xff0c;一个应用系统可能包含多个微服务&#xff0c;每个微服务可…

软数据与硬数据的深度解析:住宅代理如何优化数据抓取

引言 什么是软数据&#xff1f;有哪些类型&#xff1f; 什么是硬数据&#xff1f;有哪些类型&#xff1f; 软数据和硬数据的区别是什么&#xff1f; 如何收集软数据和硬数据&#xff1f; 如何优化抓取软数据和硬数据&#xff1f; 总结 引言 在大数据时代&#xff0c;企业…

Sanic 和 Go Echo 对比

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【Python系列】 并发编程在数据处理中的应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…