opencv_createsamples и opencv_traincascade, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName - ваш рабочий каталог.negatives.dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txtdir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txtC:\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 100C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vecC:\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-5face_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), чтобы узнать, насколько велико пересечение (сколько пикселей в нём). Это тоже может быть полезно если ты хочешь "прощать" небольшие пересечения.