小白的树莓派Tensorflow opencv 学习笔记(二)

OpenCV扩容训练样本

想要从零开始训练一个物体检测器并且确保正确性需要非常多的样本,如果不想利用别人封装好的样本就需要自己制作正负样本拍摄图片圈定区域,这个过程有点过于枯燥乏味,因此希望借助OpenCV进行简单的图形变换在短时间内得到成倍的训练样本。以下是几种简单的变换方法和示例代码。

裁剪

下面是一段简单的随机裁剪代码

import cv2
import cv2
import random
img = cv2.imread("2.jpg")
width,height,depth = img.shape
img_width_box = int(width * 0.2) #裁剪大小
img_height_box = int(height * 0.2)
for i in range(9):  #裁剪9张
    X = int(random.uniform(0, width * 0.8))
    Y = int(random.uniform(0, height * 0.8))
    copyImg = img[X:X+img_width_box,Y:Y+img_height_box]
    cv2.imshow("test"+str(i),copyImg)
cv2.waitKey(0)

旋转

如果不希望改变训练样本的大小,可以通过随机旋转变换来扩大数据库文件。

import cv2
img = cv2.imread("2.jpg")
rows,cols,depth = img.shape
#利用getRotationMatrix2D函数,第一个参数是旋转中心,第二个是逆时针旋转角度,第三个是缩放倍数
img_change = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
#利用warpAffine函数对图像重新压缩和现实
res = cv2.warpAffine(img,img_change,(rows,cols))
cv2.imshow("test",res)
cv2.waitKey(0)

但是这个代码进行旋转显示图像会有不完全显示的问题

图像色彩的随机变换

改变图像色调、饱和度、明暗度来扩增样本

import cv2
import numpy as np
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:,:,0] = (turn_green_hsv[:,:,0] + np.random.random())%180
turn_green_hsv[:,:,1] = (turn_green_hsv[:,:,1] + np.random.random())%180
turn_green_hsv[:,:,2] = (turn_green_hsv[:,:,2] + np.random.random())%180
turn_green_img = cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_green_img)
cv2.waitKey(0)

为了在图像中加入一定的噪声还可以对变换之后的图像进行Gamma变换

鼠标监控

最后是利用OpenCV对鼠标进行监控从而能够轻易地标记出目标位置,当然也可以用labelimg对训练图像进行处理

这是一段利用鼠标圈定目标物体的代码(画图没有拖拽效果,如果需要获得良好的画图体验,可以利用cv2_EVENT_FLAG_LBUTTON(左键拖拽来实现)

import cv2
rect_start = (0,0)
rect_end = (0,0)   #初始化方框区域对角线顶点坐标
def on_mouse(event,x,y,flags,param):
    global rect_start 
    global rect_end    

    if event == cv2.EVENT_LBUTTONDOWN:
        rect_start = (x,y)
    elif event == cv2.EVENT_LBUTTONUP:
        rect_end = (x,y)
        cv2.rectangle(img,rect_start,rect_end,(0,225,0),2)

img = cv2.imread("2.jpg")
cv2.namedWindow("test")
cv2.setMouseCallback("test",on_mouse)

while(True):
    cv2.imshow("test",img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

对于OpenCV的学习先到此为止,如果之后还有需要那再继续钻研

发布了25 篇原创文章 · 获赞 2 · 访问量 2116

猜你喜欢

转载自blog.csdn.net/weixin_43874764/article/details/104157347
今日推荐