If you want to train an object detector from scratch and ensure the correctness, you need a lot of samples. If you don't want to use others' encapsulated samples, you need to make positive and negative samples to take pictures and delineate the area. This process is a bit too boring, so you want to use OpenCV to carry out simple graphic transformation and get multiple training samples in a short time. Here are some simple transformation methods and sample code.
Here is a simple random clipping code
import cv2 import cv2 import random img = cv2.imread("2.jpg") width,height,depth = img.shape img_width_box = int(width * 0.2) #Tailoring size img_height_box = int(height * 0.2) for i in range(9): #9 clipping 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)
If you do not want to change the size of training samples, you can expand the database file by random rotation transformation.
import cv2 img = cv2.imread("2.jpg") rows,cols,depth = img.shape #Using the getRotationMatrix2D function, the first parameter is the rotation center, the second is the counterclockwise rotation angle, and the third is the scaling factor img_change = cv2.getRotationMatrix2D((cols/2,rows/2),45,1) #Image recompression and reality using warpAffine function res = cv2.warpAffine(img,img_change,(rows,cols)) cv2.imshow("test",res) cv2.waitKey(0)
But the rotation of this code will cause incomplete display of the image
Change the hue, saturation and brightness of the image to enlarge the sample
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)
In order to add some noise to the image, the transformed image can also be Gamma transformed
Finally, OpenCV is used to monitor the mouse so as to mark the target position easily. Of course, labelimg can also be used to process the training image
This is a code that uses the mouse to circle the target object (drawing has no drag effect, if you need to get a good drawing experience, you can use CV2 "event" flag "lbutton (drag with the left key to achieve)
import cv2 rect_start = (0,0) rect_end = (0,0) #Initialize box area diagonal vertex coordinates 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
This is the end of OpenCV learning. If there is any need later, continue to study