opencv_createsamples
и opencv_traincascade
, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName
- ваш рабочий каталог.negatives
.dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txt
dir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txt
C:\MyDirName\positives
и C:\MyDirName\training
. Поместите ваше изображение - положительный пример в каталог C:\MyDirName\
и назовите его positive.jpg
. В качестве положительного примера желательно разместить ваш объект на светлом фоне, если он тёмный, и наоборот.opencv_createsamples
. Команда будет выглядеть примерно следующим образом:C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -img positive.jpg -bg negatives\negatives_rel.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -bgcolor 0 -bgthresh 0 -w 50 -h 50 -num 100
C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vec
C:\MyDirName\opencv_traincascade.exe -data training -vec positives\positives.vec -bg negatives\negatives_abs.txt -numStages 100 -numPos 100 -numNeg 100 -featureType haar -w 20 -h 20 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -precalcValBufSize 4048 -precalcIdxBufSize 4048 -numThreads 24 -acceptanceRatioBreakValue 10e-5
face_cascade = "C:\mine\haarcascade_frontalface_alt.xml"
...
face_cascade.detectMultiScale(
cv2.CascadeClassifier()
. img1[top1:bottom1, left1:right1] = img2[top2:bottom2, left2:right2]
image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)
mask = image[..., 3] > 0 # если считаем, что чем меньше - тем прозрачнее
background[top:bottom, left:right][mask] = image[mask] # не забываем про равенство размера!
Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?
import cv2
import sys
import matplotlib.pyplot as plt
original = cv2.imread(sys.argv[1])
ix = -1
iy = -1
drawing = False
def draw_reactangle_with_drag(event, x, y, flags, param):
global ix, iy, drawing, original
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix = x
iy = y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
cv2.imshow("Title of Popup Window", img)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
print(ix, iy, x, y)
cv2.imshow("Title of Popup Window", img)
cv2.namedWindow(winname= "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
cv2.imshow("Title of Popup Window", original)
while True:
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
cv2_inwrite(/content/2 (1).jpeg, im)
def process_one_part(part: numpy.ndarray) -> numpy.ndarray:
...
# пустое изображение такого же размера, как исходное, с тремя каналами по 8 бит на канал
# если на выходе у тебя другое число каналов или тип данных, поправишь
result = numpy.zeros(image.shape[:2] + (3,), numpy.uint8)
for i in range(img_h // bl_h):
for j in range(img_w // bl_w):
cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
processed = process_one_part(cropped)
# нужно, чтобы присваиваемый фрагмент имел такой же размер, как "окно" присваивания
result[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w] = processed
# дальше делаешь с result что тебе нужно
(cx, cy), (w, h), angle
, где cx, cy - координаты центра, w, h - размеры прямоугольника, angle - угол поворота в градусах.intersection = numpy.logical_and(A, B)
if intersection.any():
print('Collision!')
numpy.count_nonzero(intersection)
, чтобы узнать, насколько велико пересечение (сколько пикселей в нём). Это тоже может быть полезно если ты хочешь "прощать" небольшие пересечения.