制作好自己yolo格式的数据集后,由于其数据量比较小只有357张照片,且数据集中的目标颜色特征明显,于是考虑RGB通道互换使数据集扩充至三倍,同时使images和labels中jpg文件和txt文件仍保持一一对应;
转换前:
转换后(两张图片test用):
1.1 简述
OpenCV读取图片的方法是cv2.imread()
,读取出来图片的格式是BGR与常规的彩色图像的格式(RGB)相反,这一点一定要注意。
OpenCV显示图片的方法是cv2.imshow()
,显示的格式是BGR。
2.1 简述
OpenCV保存图片用cv.imwrite(filename, img)
,filename为保存的路径名称,img为要保存的图片。
需要注意如下几点:
1. cv2保存的共三个维度(高,宽,通道)。
2. 保存的图片格式也是BGR。
3. 将numpy转为np.uint8格式
函数 cv2.imwrite() 用于将图像保存到指定的文件。
retval = cv2.imwrite(filename, img [, paras])
filename
:要保存的文件的路径和名称,包括文件扩展名img
:要保存的 OpenCV 图像,nparray 多维数组paras
:不同编码格式的参数,可选项cv2.CV_IMWRITE_JPEG_QUALITY
:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高cv2.CV_IMWRITE_WEBP_QUALITY
:设置 .webp 格式的图片质量,取值为 0-100;cv2.CV_IMWRITE_PNG_COMPRESSION
:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大retval
:返回值,保存成功返回 True,否则返回 False复制文件 :shutil.copy()
shutil.copy('文件名',‘目的文件夹)
复制到目的文件夹下面
shutil.copy('文件名',‘目的文件夹/新文件名’)
复制到目的文件夹下面,之后重命名
移动文件 :shutil.move()
shutil.move('文件名',‘目的文件夹)
移动到目的文件夹下面
shutil.move('文件名',‘目的文件夹/新文件名’)
移动到目的文件夹下面,之后重命名
# 引入shutil模块
import shutil
# 复制或移动到目的文件夹下面
# 如果只写目标文件夹的名称的话,如果目标文件夹不存在,则会将复制或移动之后的文件重命名为目标文件夹的名称
# demo.txt 复制到 新的文件夹 下面
shutil.copy('demo.txt','新的文件夹')
# file1.txt 移动到 新的文件夹 下面
shutil.move('file1.txt','新的文件夹')
# 复制或移动到目的文件夹下面之后,重命名
# 如果目标文件夹不存在,则会报错
# demo.txt 复制到 新的文件夹 下面,并重命名为new1.txt
shutil.copy('demo.txt','新的文件夹/new1.txt')
# file2.txt 移动到 新的文件夹 下面,并重命名为 new2.txt
shutil.move('file2.txt','新的文件夹/new2.txt')
复制和移动文件,如果目的文件夹不存在,或者要复制和移动的文件不存在,则都会报错。
复制和移动对于移动到的文件夹下面是否存在同名文件,处理结果不同。如果同名文件存在,文件可以成功复制,并覆盖目标文件。而移动文件的话,同名文件存在,则报错。
# 建议在复制或移动之前做相应判断
if os.path.exists('新的文件夹'):
shutil.copy('demo.txt','新的文件夹')
else:
print('目的文件夹不存在,无法复制')
if os.path.exists('新的文件夹'):
shutil.move('file1.txt','新的文件夹')
else:
print('目的文件夹不存在,无法移动')
import matplotlib.pyplot as plt
import cv2
img=cv2.imread('F:cat.jpg')
b,g,r=cv2.split(img)
img_rgb=cv2.merge([r,g,b])
对于rgb读取转换为bgr显示的3种方法:
#方法1
img_rgb1=cv2.merge([R,G,B])
#方法2
imgrgb2=cv2.cvtColor(img,cv.COLOR_BGR2RGB)
#方法3
img_rgb3=img[:,:,::-1]
import cv2
import os
import re
from glob import glob
import shutil
from numpy import TooHardError
dir = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/data/images/"#转换后图片保存位置
ray_path = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/test/images/"#原始图片位置
labels_dir = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/data/labels/"#转换后图片label保存位置
ray_labels_path = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/test/labels/"#原始图片labels位置
frames = glob(os.path.join(ray_path, '*.jpg'))
for i, frame in enumerate(frames):
pattern = re.compile(r'([^<>/\\\|:""\*\?]+)\.\w+$')
data = pattern.findall(frame)
data_now = data[0]
Newdir = os.path.join(ray_path, str(data_now) + '.jpg')
img = cv2.imread(Newdir)
# print(Newdir)
B, G, R = cv2.split(img) #openCV切分为BGR三个通道
img_GRB = cv2.merge([G, R, B])#重定义为GRB顺序
img_RGB = cv2.merge([R, G, B])#重定义为RGB顺序
img_BGR = cv2.merge([B, G, R])#重定义为BGR顺序
lablename= Newdir.split("/")[-1]#获取图片的名字(含文件名后缀)
# print(lablename)
lablename = lablename.split(".")[0]#获取图片的名字(不含文件名后缀)
# print(lablename)
labelpath = os.path.join(ray_labels_path,lablename)#获取该图片labels的完整路径
all_dir = labelpath+'.txt'
print(all_dir)
if os.path.exists(all_dir): #判断该图片在labels路径下是否有对应的label
# os.rename(labelpath+'.txt',labelpath+'_RGB'+'.txt')#如果有,就在它移动之后重命名操作
shutil.copyfile(all_dir,labels_dir + lablename + '_RGB.txt')
shutil.copyfile(all_dir,labels_dir + lablename + '_BGR.txt')
shutil.copyfile(all_dir,labels_dir + lablename + '_GRB.txt')
else:
print("The file does not exist")
name_GRB = str(data_now) + "_GRB"+".jpg"
name_RGB = str(data_now) + "_RGB"+".jpg"
name_BGR = str(data_now) + "_BGR"+".jpg"
cv2.imwrite(dir + name_GRB, img_GRB)
cv2.imwrite(dir + name_RGB, img_RGB)
cv2.imwrite(dir + name_BGR, img_BGR)
参考链接:
1.Python-OpenCV读取与保存图片