TypeError: невозможно преобразовать тип ndarray в числитель / знаменатель - PullRequest
0 голосов
/ 05 мая 2020

Ошибка, которую я получаю Вот мой код. Я не могу понять эту ошибку. Я много пробовал, но не нашел правильного решения. Пожалуйста, помогите мне узнать, в чем ошибка.

import numpy as np
import cv2
from skimage.feature import local_binary_pattern
import statistics 
from os import read
from google.colab.patches import cv2_imshow

cap = cv2.VideoCapture('/content/4.forged4.avi')

countF = cap.get(cv2.CAP_PROP_FPS) # calculate no of frames per sec

while True:
   ret, frame = cap.read()
   if ret:
     gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     gray = np.array(gray_img).astype(int)
     frames.append(gray)
     #cv2_imshow(gray_img) 
     radius = 3

     p = 8 * radius
     lbp =  local_binary_pattern(gray_img,p, radius, method = 'uniform') 
     print(lbp)
     val =  statistics.stdev(lbp) # caluculated standard deviation
     print(val)
     if val == 0:
       print("Authenticated")
     else:
       print("Forgery Detected!")

1 Ответ

0 голосов
/ 05 мая 2020

statistics.stdev ожидает в качестве аргумента итерацию (например, список) действительных чисел с как минимум двумя значениями. Вы передаете ему переменную lbp, которая не удовлетворяет этому требованию (это список списков). Вы можете провести простые эксперименты, чтобы увидеть, как ведут себя функции, если документация не совсем понятна. Вот, например, что я сделал:

$ python3
>>> import statistics
>>> help(statistics.stdev)
Help on function stdev in module statistics:

stdev(data, xbar=None)
    Return the square root of the sample variance.

    See ``variance`` for arguments and other details.
    ...
>>> help(statistics.variance)
Help on function variance in module statistics:

variance(data, xbar=None)
    Return the sample variance of data.

    data should be an iterable of Real-valued numbers, with at least two
    values.
    ....
>>> l = [[1.0 ,2.0, 3.0], [4.0, 5.0, 6.0]]
>>> statistics.stdev(l)
Traceback (most recent call last):
...
TypeError: can't convert type 'list' to numerator/denominator
>>> l = [1.0 ,2.0, 3.0]
>>> statistics.stdev(l)
1.0
>>> 

Как видите, передача списка списков чисел в stdev приводит к ошибке, которую вы получаете, тогда как передача списка чисел работает правильно.

Мораль этой истории заключается в том, что локальный двоичный шаблон lbp, который вы вычисляете двумя строками выше, не соответствует типу, который нужно передать в stdev.

Вот почему python программа не работает, но вполне вероятно, что основная причина этого - непонимание с вашей стороны того, что следует делать. Если имеет смысл вычислить стандартное отклонение записей в lbp (и это большое, если я не могу ответить за вас), то вы можете попробовать сгладить lbp, который представляет собой список списки до одного списка, прежде чем передавать его в stdev. Но есть ли в этом смысл? Только вы можете ответить на этот вопрос, и только если вы понимаете проблему, которую пытаетесь решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...