Ошибка в моем коде Py с использованием нескольких файлов Python
Для школьного проекта мне нужно написать код Python в нескольких файлах для лучшей организации.
Я использую Opencv 3.2.
Мне было очень больно делать это, на самом деле я получил 2 использования программы ColorDetetion.
Вот мой главный
# Set default logging handler to avoid "No handler found" warnings.
import logging
from DetectGreen import DetectGreen
from camera import Camera
import sys
from time import sleep
import threading
LOGGER = logging.getLogger(__name__)
class Main(object):
camera = Camera()
detectred = DetectGreen(hLower=0, uLower=0, vLower=0,
hUpper=255, uUpper=255, vUpper=255)
detectgreen = DetectGreen(hLower=154, uLower=66, vLower=250,
hUpper=179, uUpper=132, vUpper=255)
logging.basicConfig(level=logging.DEBUG,
format="%(levelname)s %(asctime)s [%(process)d] %(name)s %(filename)s:%(lineno)d %(message)s",
)
def __init__(self):
"""Initialize MyClassManager instance."""
LOGGER.debug("Create instance of MyClassManager")
super(Main, self).__init__()
self._worker = None
LOGGER.info("End of init...")
camera.start()
sleep(5)
detectred.start()
detectgreen.start()
Вот мой класс для камеры, он прекрасно работает:
import cv2
import numpy as np
import threading
from time import sleep
import logging
LOGGER = logging.getLogger(__name__)
class Camera(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.end = False
self.ret = True
self.frame = ["", ""]
def run(self):
self.instantiate()
while not self.end:
# Read image
self.ret, self.frame = self.cam.read()
cv2.imshow('frame', self.frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
self.end = True
LOGGER.info("Clean before finish working...")
def afficher(self):
print("Resultat methode affichage")
def instantiate(self):
self.cam = cv2.VideoCapture(0)
Вот мое определение цвета:
# Standard imports
import cv2
import numpy as np
import threading
from time import sleep
import logging
from camera import Camera
LOGGER = logging.getLogger(__name__)
class DetectGreen(threading.Thread):
def __init__(self,
hLower, uLower, vLower,
hUpper, uUpper, vUpper):
self._camera = Camera()
threading.Thread.__init__(self)
# self._stopper = threading.Event()
LOGGER.info("Create thread DetectGreen")
self._hLower = hLower
self._hUpper = hUpper
self._uLower = uLower
self._uUpper = uUpper
self._vLower = vLower
self._vUpper = vUpper
def run(self):
mask = (0, 0, 0)
end = False
print("lancement")
LOGGER.info("DetectGreen Start worker...")
while not end:
LOGGER.info("DetectGreen Working...")
sleep(1)
# Read image
# cam = cv2.VideoCapture(0)
while(1):
if not self._camera.ret:
break
canvas = self._camera.frame.copy()
print("132")
hsv = cv2.cvtColor(self._camera.frame, cv2.COLOR_BGR2HSV)
lower = (self._hLower, self._uLower, self._vLower) # 130,150,80
upper = (self._hUpper, self._uUpper, self._vUpper) # 250,250,120
mask = cv2.inRange(hsv, lower, upper)
mask = cv2.erode(mask, None, iterations=6)
mask = cv2.dilate(mask, None, iterations=4)
cv2.imshow('frame', self.frame)
try:
# NB: using _ as the variable name for two of the outputs, as they're not used
_, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
blob = max(contours, key=lambda el: cv2.contourArea(el))
M = cv2.moments(blob)
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
cv2.circle(canvas, center, 10, (0, 0, 255), -1)
except (ValueError, ZeroDivisionError):
pass
Обнаружение цвета дает мне огромную сложность "конвертировать". Я действительно не знаю, как я могу использовать copy() без ошибок в программе ColorDetection (self._camera.frame.copy()
) дайте мне следующую ошибку "объект списка" не имеет атрибута "копия", которую я понимаю, но да, мой фрейм является матом, может быть, я неправильно его определила? Или есть вопросы с потоками?
DetectColor использует камеру, а основной используется для запуска каждой задачи в хорошем порядке. Я получил 2 py-файла для интеграции после них.