Проблемы OpenCv в Python Resutling 'int' объект не может быть вызван - PullRequest
0 голосов
/ 05 августа 2020

Ситуация: Я пытаюсь найти различия между кадрами моего видео. У меня есть 35000 таких рамок, и все они имеют название типа FRAMENUMBER.jpg. Они есть в каталоге, но не отсортированы. Это мой код, который я написал, чтобы найти отличия, но у меня есть несколько проблем.

import os
import cv2
import pandas as pd 
frame = []
pic = []
directory = r'/home/kjo2/video'
for filename in os.listdir(directory):
    if filename.endswith(".jpg"):
        bob = os.path.join(filename)
        pic.append(bob)
    else:
        continue
pd.DataFrame(pic).to_csv("boo.csv")
for counter in range(1,35000):
    if counter == 35000:
        img1 = cv2.IMREAD_GRAYSCALE("%s",pic[(counter - 1)])
        img2 = cv2.IMREAD_GRAYSCALE("%s",pic[0])
        diff = cv2.absdiff(img1, img2)
        frame.append(diff)
    else:
        img1 = cv2.IMREAD_GRAYSCALE("%s",pic[(counter - 1)])
        img2 = cv2.IMREAD_GRAYSCALE("%s",pic[counter])
        diff = cv2.absdiff(img1, img2)
        frame.append(diff)
pd.DataFrame(frame).to_csv("foo.csv")

Ошибки:

  1. Все до секунды за 1 oop работает, но есть проблема с массивом pi c. Поскольку файлы не отсортированы, массив также не отсортирован. Каким будет простой способ отсортировать эти файлы в порядке возрастания.
  2. Когда я пытаюсь прочитать изображение с помощью модуля opencv, он всегда выдает ошибку
File "frame.py", line 20, in <module>
    img1 = cv2.IMREAD_GRAYSCALE("%s",pic[(counter - 1)])
TypeError: 'int' object is not callable

Я пытаясь перебрать файлы и сравнить различия между ними. Что не так с моим для l oop или какое лучшее решение этой проблемы?

Я использую Python 3.6.9 (по умолчанию, 17 июля 2020 г., 12:50:27) [G CC 8.4.0] на linux.

1 Ответ

1 голос
/ 05 августа 2020

Эта ошибка говорит вам, что cv2.IMREAD_GRAYSCALE - это число. Правильный способ его использования - сделать что-то вроде

img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)

или, в вашем случае,

img1 = cv2.imread(pic[counter - 1], cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(pic[counter], cv2.IMREAD_GRAYSCALE)

Поскольку вы сравниваете соседние изображения, вы можете сэкономить половину чтения ( и немного упростите код), повторно используя одно из изображений.

img1 = cv2.imread(pic[0], cv2.IMREAD_GRAYSCALE)
for i in range(1, len(pic)):
    img2 = cv2.imread(pic[i], cv2.IMREAD_GRAYSCALE)
    frame.append(cv2.absDiff(img1, img2))
    img1 = img2

    
...