Пример #1
0
    def resize_threshold(self, capture):
        """
            这是一个类的辅助方法,通过调整self.threshold这个二值图转换阈值的值,使图像更适合于巡线
        :param capture: 输入一个VideoCapture对象
        """
        si = ShowImage()
        tracker = np.zeros((320, 100))
        si.show(tracker, "control")
        cv2.createTrackbar('Threshold', 'control', 1, 255, self._nothing)
        cv2.createTrackbar('Kernel', 'control', 1, 8, self._nothing)
        cv2.createTrackbar('Iterations', 'control', 1, 5, self._nothing)
        while True:
            _, img1 = capture.read()

            self.threshold = cv2.getTrackbarPos('Threshold', 'control')
            self.iterations = cv2.getTrackbarPos('Kernel', 'control')
            k_value = cv2.getTrackbarPos('Iterations', 'control')
            self.kernel_type = (k_value, k_value)

            si.show(tracker, "control")
            img2 = self.processing(img1)
            si.show(img2, "Output Frame")
            si.show(img1, "Input Frame")
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        capture.release
Пример #2
0
 def __init__(self, line_camera='/dev/video1', od_camera='/dev/video0', serial_port='/dev/ttyUSB0'):
     self._line_camera = line_camera
     self._od_camera = od_camera
     self._serial_port = serial_port
     self.line_camera_width = 320
     self.line_camera_height = 240
     self.od_camera_width = 320
     self.od_camera_height = 240
     self.recognition = Recognition(device=od_camera, width=self.od_camera_width, height=self.od_camera_height)
     self._serial = CarSerial(self._serial_port)
     self.car_controller = CarController(self._serial)
     self.line_camera_capture = cv2.VideoCapture(self._line_camera)
     self.video = VideoWriter("video/" + time.strftime("%Y%m%d%H%M%S"), 320, 240)
     # ret, self.original_frame = self.line_camera_capture.read()
     self.available_frame = None
     self.render_frame = None  # cv2.resize(self.original_frame, (320, 240))
     self.frame_rate_timer = CarTimer()
     self.display = ShowImage()
     self.is_open_window = True
     self.is_print_frame_rate = True
     self.is_save_video = False
Пример #3
0
import sys
sys.path.append("..")  # 添加模块路径
from cv.image_init import ImageInit  # 导入类
from cv.show_images import ShowImage
from cv.follow_line import FollowLine
from car.car_controller import CarController
from car.car_serial import CarSerial

SERIAL = "/dev/ttyACM0"  # 串口
CAMERA = '/dev/video0'  # USB摄像头,如果有多个摄像头,各个摄像头设备文件就是video0,video1,video2等等

camera = cv2.VideoCapture(CAMERA)

# 初始化显示对象,该对象专门为小车的7寸屏幕设计,当多个视频需要显示时,自动排列窗口的位置,避免窗口重叠。
# 同时该对象把所有的窗口大小都设置为320*240以适应小屏幕。
display = ShowImage()

# 对象用于对输入的图形进行二值化(或者灰度),同时对图形进行腐蚀,以去除部分图像噪声。
# 具体的参数的意义请参考类说明
# 这里要特别注意,bitwise_not为True时图像颜色进行了反转,对于灰度图,也就是黑变白,白变黑,适合于引导线是黑色的地图。
init = ImageInit(width=320,
                 height=240,
                 convert_type="BINARY",
                 threshold=120,
                 bitwise_not=True)

# fl对象用于寻找引导线偏离图像中心的位置,threshold是控制连续白色的的阈值,也就是只有连续多少个白色像素点才认为已经找到引导线
# direction是开始寻找的方向,True是从左边开始寻找,False是右边。当顺时针绕圈时,引导线大概率出现在右边,所以可以选择False。
fl = FollowLine(width=320, height=240, threshold=15, direction=False)

# 串口类,此类最好不要直接使用,而是通过CarController来对车子进行控制
Пример #4
0
import cv2
import sys
sys.path.append('..')
from cv.show_images import ShowImage
import time
from cv.image_init import ImageInit
LINE_CAMERA_WIDTH = 320
LINE_CAMERA_HEIGHT = 240
camera = cv2.VideoCapture('/dev/video0')
freq = cv2.getTickFrequency()
show_image = ShowImage()

init = ImageInit(320, 240)
ret, frame = camera.read()

while True:
    t1 = time.perf_counter()
    # 获取一帧
    ret, frame = camera.read()

    show_image.show(frame)

    image = init.processing(frame)
    show_image.show(image, window_name="image")
    t2 = time.perf_counter()
    frame_rate_calc = 1.0 / (t2 - t1)
    print(frame_rate_calc)
    if cv2.waitKey(1) == ord('q'):
        break

camera.release()
"""

import cv2
import sys
sys.path.append("..")                       # 添加模块路径
from cv.image_init import ImageInit         # 导入类
from cv.show_images import ShowImage


CAMERA = '/dev/video0'      # USB摄像头,如果有多个摄像头,各个摄像头设备文件就是video0,video1,video2等等

camera = cv2.VideoCapture(CAMERA)

# 初始化显示对象,该对象专门为小车的7寸屏幕设计,当多个视频需要显示时,自动排列窗口的位置,避免窗口重叠。
# 同时该对象把所有的窗口大小都设置为320*240以适应小屏幕。
display = ShowImage()

# 对象用于对输入的图形进行二值化(或者灰度),同时对图形进行腐蚀,以去除部分图像噪声。
# 具体的参数的意义请参考类说明
init = ImageInit(width=320, height=240, convert_type="BINARY", threshold=250)


while True:
    ret, frame = camera.read()          # 读取每一帧
    display.show(frame, "frame")           # 在屏幕上的frame窗口显示帧
    image = init.processing(frame)         # 对帧进行处理
    display.show(image, "image")           # 显示处理后的帧

    # 检测键盘,发现按下 q 键 退出循环
    if cv2.waitKey(1) == ord('q'):
        break
Пример #6
0
qf_line = FollowLine(LINE_CAMERA_WIDTH,
                     LINE_CAMERA_HEIGHT,
                     direction=False,
                     threshold=5)
# 寻找路口对象
fi = FindIntersection(radius=150, threshold=4, repeat_count=2, delay_time=1.7)
# 寻找路障对象
fr = FindRoadblock(0, 200, 134, 255, 202, 255, 0.05)
# 寻找斑马线对象
fzc = FindZebraCrossing(threshold=4, floor_line_count=3)
# 保存视频对象
# vw = VideoWriter("video/" + time.strftime("%Y%m%d%H%M%S"), 320, 240)
# 一个计时器,用于计算帧速
timer = CarTimer()
# 显示图片的对象
si = ShowImage()
# endregion
serial.drive_servo(90)
while True:
    # 帧计时开始
    timer.restart()

    # 通过摄像头读入一帧
    ret, frame = camera.read()

    # 改变图像的大小
    frame = img_init.resize(frame)
    si.show(frame, "camera")

    # 把图片二值化,并去噪
    image = img_init.processing(frame)
Пример #7
0
import cv2
import sys
import os

sys.path.append('..')
sys.path.append('../FaceMaskDetection/')
from cv.show_images import ShowImage
import time
from cv.image_init import ImageInit
from FaceMaskDetection.mask_detect import MaskDetect

LINE_CAMERA_WIDTH = 260
LINE_CAMERA_HEIGHT = 260
camera = cv2.VideoCapture('/dev/video0')
freq = cv2.getTickFrequency()
show_image = ShowImage()

init = ImageInit(260, 260)
j_path = os.path.abspath(os.path.dirname(
    os.getcwd())) + '/FaceMaskDetection/models/face_mask_detection.json'
w_path = os.path.abspath(os.path.dirname(
    os.getcwd())) + '/FaceMaskDetection/models/face_mask_detection.hdf5'

mask = MaskDetect(json_path=j_path,
                  weight_path=w_path,
                  width=LINE_CAMERA_WIDTH,
                  height=LINE_CAMERA_HEIGHT)

while True:
    t1 = time.perf_counter()
    # 获取一帧
Пример #8
0
class CarBase:
    """
        为车子的控制提供一个基类,把一些重复的变量和函数写在基类
        继承本类的子类只需要关注于具体的操作
        类变量task_list用于存储子类的操作任务,并由基类的mail_loop负责执行
    """
    task_list = []

    def __init__(self, line_camera='/dev/video1', od_camera='/dev/video0', serial_port='/dev/ttyUSB0'):
        self._line_camera = line_camera
        self._od_camera = od_camera
        self._serial_port = serial_port
        self.line_camera_width = 320
        self.line_camera_height = 240
        self.od_camera_width = 320
        self.od_camera_height = 240
        self.recognition = Recognition(device=od_camera, width=self.od_camera_width, height=self.od_camera_height)
        self._serial = CarSerial(self._serial_port)
        self.car_controller = CarController(self._serial)
        self.line_camera_capture = cv2.VideoCapture(self._line_camera)
        self.video = VideoWriter("video/" + time.strftime("%Y%m%d%H%M%S"), 320, 240)
        # ret, self.original_frame = self.line_camera_capture.read()
        self.available_frame = None
        self.render_frame = None  # cv2.resize(self.original_frame, (320, 240))
        self.frame_rate_timer = CarTimer()
        self.display = ShowImage()
        self.is_open_window = True
        self.is_print_frame_rate = True
        self.is_save_video = False

    def main_loop(self):
        """
            整个程序的主循环,子类的各个操作模块,建立后,把它加入task_lisk列表,由本函数负责循环执行
            子类不用再写循环。
        """
        # 通过摄像头读入一帧
        while True:
            ret, self.original_frame = self.line_camera_capture.read()  # 读取一帧
            size = (self.line_camera_width, self.line_camera_height)    # 改变大小
            self.render_frame = cv2.resize(self.original_frame, size)
            self.original_frame = self.render_frame

            # 循环任务列表,按顺序执行,ImageInit需要先于其他cv下面的对象执行
            for task in CarBase.task_list:
                tmp = []
                if isinstance(task, ImageInit):     # 没办法弄成一样,所以写了两个if
                    self.available_frame = task.execute(self.original_frame)
                elif isinstance(task, FindRoadblock):
                    task.execute(self.original_frame, None)
                else:
                    tmp.append(self.render_frame)
                    task.execute(self.available_frame, tmp)
            # 实际的小车控制操作由update控制
            self.car_controller.update()

            if self.is_open_window:     # 其实如果不开窗口,必定无法退出
                self.display_window()
            if self.is_print_frame_rate:    # 这个可以取消
                self.display_frame_rate()
            if self.is_save_video:          # 保存视频
                self.video.write(self.render_frame)

            # 检测键盘,发现按下 q 键 退出循环
            if cv2.waitKey(1) == ord('q'):
                break

    def display_window(self):
        """
            显示三个窗口,大多数情况下都是需要三个窗口,所以干脆用一个函数建立把它显示出来。
        :return:
        """
        self.display.show(self.original_frame, '原始')
        self.display.show(self.available_frame, '实际')
        self.display.show(self.render_frame, '渲染')

    def display_frame_rate(self):
        """
            打印帧速率
        """
        print("帧速度:{} 帧/秒".format(1.0/self.frame_rate_timer.duration()))
        self.frame_rate_timer.restart()

    def close(self):
        """
            一些需要手动释放的对象
        """
        self._serial.drive_motor(0, 0)  # 停车
        self._serial.drive_servo(90)    # 把舵机调到90度
        self.line_camera_capture.release()  # 释放巡线摄像头
        cv2.destroyAllWindows()     # 关闭窗口
        self.recognition.close()    # 关闭对象检测
        self._serial.close()        # 关闭窗口
        self.video.release()        # 关闭录像对象