Opencv Python падает после определенного времени - PullRequest
0 голосов
/ 28 июня 2019

В моем коде после определенного времени (зависит от ПК или ОС) вылетает.Отображаемая ошибка:

libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data 

Мой код рисует окупаемость инвестиций на видео с веб-камеры и делает снимок.ROI удаляется через 5-10 минут (я не уверен, почему, это ошибка), и сохраненное изображение не имеет размеров, тогда отображается ошибка выше, но я не нахожу ошибку.Инструкции: нажмите «c», чтобы остановить видео и нарисовать ROI, снова нажмите «c», чтобы сделать снимок, нажмите «r», чтобы возобновить видео, и повторите, если вам нужны другие изображения.Я протестировал код в Windows 10 и raspbian на малине, и время не совпадает, но в обеих программах происходит сбой.Это мой код:

import cv2

# python PSI_Camera_test.py


class staticROI(object):
    def __init__(self):
        self.capture = cv2.VideoCapture(0)
        self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
        self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
        # Bounding box reference points and boolean if we are extracting coordinates
        self.image_coordinates = []
        self.extract = False
        self.selected_ROI = False
        self.img_counter = 0
        self.update()

    def update(self):
        while True:
            if self.capture.isOpened():
                # Read frame
                (self.status, self.frame) = self.capture.read()
                cv2.imshow('image', self.frame)
                key = cv2.waitKey(2)

                # Crop image
                if key == ord('c'):
                    self.clone = self.frame.copy()
                    cv2.namedWindow('image')
                    cv2.setMouseCallback('image', self.extract_coordinates)
                    while True:
                        key = cv2.waitKey(2)
                        cv2.imshow('image', self.clone)

                        # Crop and display cropped image
                        if key == ord('c'):
                            self.crop_ROI()
                            img_name = "Images\opencv_frame_{}.png".format(
                                self.img_counter)
                            cv2.imwrite(img_name, self.cropped_image)
                            print("{} written!".format(img_name))
                            self.img_counter += 1

                        # Resume video
                        if key == ord('r'):
                            break
                # Close program with keyboard 'esp'
                if key % 256 == 27:
                    cv2.destroyAllWindows()
                    exit(1)
            else:
                pass

    def extract_coordinates(self, event, x, y, flags, parameters):
        # Record starting (x,y) coordinates on left mouse button click
        if event == cv2.EVENT_LBUTTONDOWN:
            self.image_coordinates = [(x, y)]
            self.extract = True

        # Record ending (x,y) coordintes on left mouse bottom release
        elif event == cv2.EVENT_LBUTTONUP:
            self.image_coordinates.append((x, y))
            self.extract = False

            self.selected_ROI = True

            # Draw rectangle around ROI
            cv2.rectangle(
                self.clone, self.image_coordinates[0], self.image_coordinates[1], (0, 255, 0), 2)

        # Clear drawing boxes on right mouse button click
        elif event == cv2.EVENT_RBUTTONDOWN:
            self.clone = self.frame.copy()
            self.selected_ROI = False

    def crop_ROI(self):
        if self.selected_ROI:
            self.cropped_image = self.frame.copy()

            x1 = self.image_coordinates[0][0]
            y1 = self.image_coordinates[0][1]
            x2 = self.image_coordinates[1][0]
            y2 = self.image_coordinates[1][1]

            self.cropped_image = self.cropped_image[y1:y2, x1:x2]

            print('Cropped image: {} {}'.format(
                self.image_coordinates[0], self.image_coordinates[1]))
        else:
            print('Select ROI to crop before cropping')


# python PSI_Camera_test.py
if __name__ == '__main__':
    static_ROI = staticROI()

Заранее спасибо!

...