OpenCv-Python обрезание картинки в видео потоке

Вобщем я пытаюсь сделать так, чтобы в видео обрезалась по контурам и сохранялась в png картинка, но очевидно он этого не делает, он вместо этого задает размеры ширину и высоту 1 и 0 естественно катринки практически не будет.Поэтому прошу помочь советом или альтернативным вариантом решения этой проблемы.

Код:


import cv2
import numpy as np
import math
import struct
i = 0
n = 1
x = 0
y = 0
raspberrypi = False;
def nothing(*args):
    pass

if __name__ == '__main__':
   
    cv2.namedWindow("result")
    cap = cv2.VideoCapture(0)

    cv2.namedWindow('Picture')
    cv2.namedWindow('Settings')
    cv2.createTrackbar('h1', 'Settings', 37, 255, nothing) #67
    cv2.createTrackbar('s1', 'Settings', 139, 255, nothing) #62
    cv2.createTrackbar('v1', 'Settings', 0, 255, nothing) #0
    cv2.createTrackbar('h2', 'Settings', 121, 255, nothing) #90
    cv2.createTrackbar('s2', 'Settings', 255, 255, nothing) #255
    cv2.createTrackbar('v2', 'Settings', 241, 255, nothing) #241
    cv2.createTrackbar('black', 'Settings', 0, 1, nothing) 
    color_blue = (255, 0, 0)
    color_red = (0, 0, 128)

    while True:
        flag, img = cap.read()
        img = cv2.flip(img, 1)

        h1 = cv2.getTrackbarPos('h1', 'Settings')
        s1 = cv2.getTrackbarPos('s1', 'Settings')
        v1 = cv2.getTrackbarPos('v1', 'Settings')
        h2 = cv2.getTrackbarPos('h2', 'Settings')
        s2 = cv2.getTrackbarPos('s2', 'Settings')
        v2 = cv2.getTrackbarPos('v2', 'Settings')
        black=cv2.getTrackbarPos('black', 'Settings')
        hsv_min = np.array((h1, s1, v1), np.uint8)
        hsv_max = np.array((h2, s2, v2), np.uint8)

        try:
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
            thresh = cv2.inRange(hsv, hsv_min, hsv_max)
            contours0, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

            for cnt in contours0:
                rect = cv2.minAreaRect(cnt)
                box = cv2.boxPoints(rect)
                box = np.int0(box)
                center = (int(rect[0][0]), int(rect[0][1]))
                area = int(rect[1][0] * rect[1][1])

                edge1 = np.int0((box[1][0] - box[0][0], box[1][1] - box[0][1]))
                edge2 = np.int0((box[2][0] - box[1][0], box[2][1] - box[1][1]))

                # usedEdge = edge1
                # if cv2.norm(edge2) > cv2.norm(edge1):
                #     usedEdge = edge2

                # reference = (1, 0)  # horizontal edge
                # angle = 180.0 / math.pi * math.acos(
                #  (reference[0] * usedEdge[0] + reference[1] * usedEdge[1]) / (cv2.norm(reference) * cv2.norm(usedEdge)))
                angle = ' '
                list_storon = []
                if area > 5000:
                    n = 0
                    cv2.drawContours(img, [box], 0, color_blue, 2)
                    cv2.circle(img, center, 5, color_red, 2)
                    cv2.putText(img, str(area), (center[0]+20, center[1]-20),
                               cv2.FONT_HERSHEY_SIMPLEX, 1, color_red, 2)


            if(raspberrypi == False):
                if (black == 0 and len(contours0) > 0):
                    try:
                        x = rect[0][0]
                        y = rect[0][1]
                        w = rect[1][0] #1, 0
                        h = rect[1][1] #1, 1
                        crop_img = img[int(y - 200):int(y + 200), int(x - w/2):int(x + w/2)]
                        print(rect)
                        if(len(crop_img) > 0 and n == 0): #and center1 == (y - x)
                            cv2.imwrite("res.png", crop_img)
                            print("Yes")
                            cv2.imshow('Picture', crop_img)
                            n = 1
                    except cv2.error:
                        print("Error")
                    cv2.imshow('result', img)
                else:     
                    cv2.imshow('result', thresh) 
        except:
            cap.release()
            raise
        ch = cv2.waitKey(5)
        if ch == 27:
            break

    cap.release()
    cv2.destroyAllWindows()

Ответы (0 шт):