我的py代码中使用多个python文件时出错
对于一个学校项目,我需要在多个文件中编写python代码,以实现更好的组织 我使用Opencv 3.2 我做这件事很痛苦,事实上我用了两次颜色检测程序 这是我的主要任务我的py代码中使用多个python文件时出错,python,opencv,Python,Opencv,对于一个学校项目,我需要在多个文件中编写python代码,以实现更好的组织 我使用Opencv 3.2 我做这件事很痛苦,事实上我用了两次颜色检测程序 这是我的主要任务 # Set default logging handler to avoid "No handler found" warnings. import logging from DetectGreen import DetectGreen from camera import Camera import sys from
# 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.\u camera.frame.copy()
)给我以下错误“'list'对象没有属性'copy'”,我理解,但是的,我的帧是一个垫子,也许我对它的定义不正确?还是有线程问题
DetectColor使用摄像头和主摄像头以良好的顺序启动每个任务。我有两个py文件要集成。你的问题似乎与“在多个文件中组织代码”无关。请给它一个更合适的标题。只是编辑了它,我只是不知道这个词来真正定义我的问题,我认为这是一个组织问题,但我不能指出关键问题。我不太明白你的问题。self.\u camera.frame是在camera.\u init\u中定义的列表,在camera.run中被覆盖。发生错误时,从未调用过Camera.run,因此self.\u Camera.frame仍然是一个列表,没有复制方法,因此无法工作。是的,我确切地知道你的意思,如何获取在Camera.run中覆盖的“frame”?谢谢