功能:可以根据是stm32的指令进行拍照,然后识别,方块颜色,并全屏显示。

import cv2
import sys
import serial
import time
import numpy as np
from PyQt5.QtWidgets import QLabel,QApplication
from PyQt5.QtGui import QPixmap
blue_val = 90#
red_val = 5
huang_val = 30
 
ser = serial.Serial("/dev/ttyAMA0",9600)  # 位置1
ser.flushInput()  # 位置2
  

 
    
def lanse_jiance():
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    # get a frame
    #frame = cv2.imread("home\pi\lanse.jpg")
    cv2.namedWindow("hah",cv2.WINDOW_FREERATIO)
    cv2.imshow("hah",frame)
    #cv2.waitKey(2000)
    print(ret)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    """阈值范围"""
    #蓝色阈值范围
    blue_lower = np.array([blue_val - 10, 100, 100])
    blue_upper = np.array([blue_val + 10, 255, 255])
    #红色阈值范围
    red_lower = np.array([red_val - 5, 100, 100])
    red_upper = np.array([red_val + 5, 255, 255])
    #黄色阈值范围
    huang_lower = np.array([huang_val - 4 ,100, 100])
    huang_upper = np.array([huang_val + 4 ,255, 255])
    
    # T阈值HSV图像以仅获得所选颜色
    blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
    red_mask = cv2.inRange(hsv, red_lower, red_upper)
    huang_mask = cv2.inRange(hsv, huang_lower, huang_upper)
    # Bitwise-AND屏蔽原始图像
    blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
    red_res = cv2.bitwise_and(frame, frame, mask=red_mask)
    huang_res = cv2.bitwise_and(frame, frame, mask=huang_mask)
    # 结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    # 形态学结束
    blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
    red_closing = cv2.morphologyEx(red_res, cv2.MORPH_CLOSE, kernel)
    huang_closing = cv2.morphologyEx(huang_res, cv2.MORPH_CLOSE, kernel)
    # 转换为黑白图像
    blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
    red_gray = cv2.cvtColor(red_closing, cv2.COLOR_BGR2GRAY)
    huang_gray = cv2.cvtColor(huang_closing, cv2.COLOR_BGR2GRAY)
    (thresh1, red_bw) = cv2.threshold(red_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    (thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    (thresh3, huang_bw) = cv2.threshold(huang_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    #只显示蓝色区域,用于测试
    #cv2.imshow("hahaa",red_bw)
    #cv2.waitKey(2000)
    
    blue_black = cv2.countNonZero(blue_bw)
    huang_black = cv2.countNonZero(huang_bw)
    red_black = cv2.countNonZero(red_bw)
    
    if blue_black > 3000:#判断二值化像素点个数
 
        print("视频中有蓝色像素")
        
        #如果有蓝色像素则显示蓝色图片
        #label.resize(300,300)
        #label.resize(1200,900)
        label.setPixmap(QPixmap("lanse.jpg"))
        
        label.show()
        label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("1".encode("utf-8"))#如果没有颜色则发送1
    if red_black > 5000:#判断二值化像素点个数
 
        print("视频中有红色像素")
#        label.resize(1200,900)
        #如果有蓝色像素则显示蓝色图片
        label.setPixmap(QPixmap("red.jpg"))
        label.show()
        label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("2".encode("utf-8"))#如果没有颜色则发送1
        
        # 完成所有操作后,释放捕获
    if huang_black > 20000:#判断二值化像素点个数
 
        print("视频中有黄色像素")
        #label.resize(1200,900)
        #如果有蓝色像素则显示蓝色图片
        label.setPixmap(QPixmap("huang.jpg"))
        label.show()
        label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("3".encode("utf-8"))#如果没有颜色则发送1
        # 完成所有操作后,释放捕获
    print("蓝色:",blue_black)
    print("红色:",red_black)
    print("黄色:",huang_black)
    #cap.release()
 
if __name__ == "__main__":
    #标签初始化
    app = QApplication(sys.argv)
    label = QLabel()
    #label.resize(1200,900)
    label.setPixmap(QPixmap("lvse.jpg"))
    label.show()
    label.showFullScreen()
    label.setScaledContents(True)  # 让图片自适应label大
    #cv2.waitKey(10000)
    while(True):
        count = ser.inWaiting()  # 位置4		读取返回值
        #print(count)
        if count != 0:
            recv = ser.read(count)  # 位置5
            #如果接受到01则开始识别
            if recv == b"\x01":
                lanse_jiance()
                cv2.waitKey(1000)
            ser.flushInput()
            time.sleep(0.1)  # 位置8
        cv2.destroyAllWindows()

第二版:

改进了黄色是识别不成功的情况

增加了判断,只能同时识别一种颜色

import cv2
import sys
import serial
import time
import numpy as np
from PyQt5.QtWidgets import QLabel,QApplication
from PyQt5.QtGui import QPixmap
blue_val = 90#
red_val = 5
huang_val = 24
 
ser = serial.Serial("/dev/ttyAMA0",9600)  # 位置1
ser.flushInput()  # 位置2
def lanse_jiance():
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    # get a frame
    #frame = cv2.imread("home\pi\lanse.jpg")
    cv2.namedWindow("hah",cv2.WINDOW_FREERATIO)
    #cv2.imshow("hah",frame)
    #cv2.waitKey(2000)
    print(ret)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    """阈值范围"""
    #蓝色阈值范围
    blue_lower = np.array([88, 100, 100])
    blue_upper = np.array([115, 255, 255])
    #红色阈值范围
    red_lower = np.array([red_val - 5, 100, 100])
    red_upper = np.array([red_val + 5, 255, 255])
    #黄色阈值范围
    huang_lower = np.array([huang_val - 6 ,100, 100])
    huang_upper = np.array([huang_val + 6 ,255, 255])
    
    # T阈值HSV图像以仅获得所选颜色
    blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
    red_mask = cv2.inRange(hsv, red_lower, red_upper)
    huang_mask = cv2.inRange(hsv, huang_lower, huang_upper)
    # Bitwise-AND屏蔽原始图像
    blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
    red_res = cv2.bitwise_and(frame, frame, mask=red_mask)
    huang_res = cv2.bitwise_and(frame, frame, mask=huang_mask)
    # 结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    # 形态学结束
    blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
    red_closing = cv2.morphologyEx(red_res, cv2.MORPH_CLOSE, kernel)
    huang_closing = cv2.morphologyEx(huang_res, cv2.MORPH_CLOSE, kernel)
    # 转换为黑白图像
    blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
    red_gray = cv2.cvtColor(red_closing, cv2.COLOR_BGR2GRAY)
    huang_gray = cv2.cvtColor(huang_closing, cv2.COLOR_BGR2GRAY)
    (thresh1, red_bw) = cv2.threshold(red_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    (thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    (thresh3, huang_bw) = cv2.threshold(huang_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    #只显示蓝色区域,用于测试
    cv2.imshow("hahaa",red_bw)
    cv2.waitKey(3000)
    
    blue_black = cv2.countNonZero(blue_bw)
    huang_black = cv2.countNonZero(huang_bw)
    red_black = cv2.countNonZero(red_bw)
    
    if blue_black > 18000 and blue_black>huang_black and blue_black>red_black:#判断二值化像素点个数
 
        print("视频中有蓝色像素")
        
        #如果有蓝色像素则显示蓝色图片
        #label.resize(300,300)
        #label.resize(1200,900)
        label.setPixmap(QPixmap("lanse.jpg"))
        
        label.show()
      #  label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("1".encode("utf-8"))#如果没有颜色则发送1
    if red_black > 5000  and red_black>huang_black and red_black>blue_black:#判断二值化像素点个数
 
        print("视频中有红色像素")
#        label.resize(1200,900)
        #如果有蓝色像素则显示蓝色图片
        label.setPixmap(QPixmap("red.jpg"))
        label.show()
    #    label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("2".encode("utf-8"))#如果没有颜色则发送1
        
        # 完成所有操作后,释放捕获
    if huang_black > 18000 and huang_black>red_black and huang_black>blue_black:#判断二值化像素点个数
 
        print("视频中有黄色像素")
        #label.resize(1200,900)
        #如果有蓝色像素则显示蓝色图片
        label.setPixmap(QPixmap("huang.jpg"))
        label.show()
#        label.showFullScreen()
        label.setScaledContents(True)  # 让图片自适应label大小
        ser.write("3".encode("utf-8"))#如果没有颜色则发送1
        # 完成所有操作后,释放捕获
    print("蓝色:",blue_black)
    print("红色:",red_black)
    print("黄色:",huang_black)
    #cap.release()
 
if __name__ == "__main__":
    #标签初始化
    app = QApplication(sys.argv)
    label = QLabel()
    #label.resize(1200,900)
    label.setPixmap(QPixmap("lvse.jpg"))
    label.show()
    #label.showFullScreen()
    label.setScaledContents(True)  # 让图片自适应label大
    #cv2.waitKey(10000)
    while(True):
        count = ser.inWaiting()  # 位置4		读取返回值
        #print(count)
        if count != 0:
            recv = ser.read(count)  # 位置5
            #如果接受到01则开始识别
            if recv == b"\x01":
                lanse_jiance()
                cv2.waitKey(1000)

            ser.flushInput()
            time.sleep(0.1)  # 位置8
        cv2.destroyAllWindows()

小车添加了标签显示文字和x,y,方向

import cv2
import sys
import serial
import time
import numpy as np
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QPushButton,QTextEdit # 这里导入了一个按钮控件
from PyQt5.QtGui import QPixmap
blue_val = 90#
red_val = 5
huang_val = 24
 
ser = serial.Serial("/dev/ttyAMA0",9600)  # 位置1
ser.flushInput()  # 位置2
class Demo(QWidget):  # 让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(600, 600)  # 设置窗口长宽都为600

        self.label = QTextEdit("Label", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.label.setText("")
        self.labelA = QTextEdit("LabelA", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.labelA.setText("")
        self.labelB = QTextEdit("LabelB", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.labelB.setText("")

        self.labelq1 = QLabel("方向", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.labelq2 = QLabel("X", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.labelq3 = QLabel("Y", self)  # 第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.labelq4 = QLabel("aksjkas",self)
        self.labelq4.resize(600,500)
        self.labelq4.move(600,100)
        self.labelq4.setScaledContents(True)  # 让图片自适应label大

        self.labelq1.move(50, 100)  #
        self.labelq2.move(50, 300)
        self.labelq3.move(50, 500)

        self.label.move(180, 20)  #
        self.labelA.move(180, 250)
        self.labelB.move(180, 470)
        
        #label.resize(1200,900)
        self.labelq4.setPixmap(QPixmap("lvse.jpg"))
        #label.showFullScreen()
        self.labelq4.setScaledContents(True)  # 让图片自适应label大
        #cv2.waitKey(10000)
        
        cap = cv2.VideoCapture(0)
        ret, frame = cap.read()
        # get a frame
        #frame = cv2.imread("home\pi\lanse.jpg")
        cv2.namedWindow("hah",cv2.WINDOW_FREERATIO)
        #cv2.imshow("hah",frame)
        #cv2.waitKey(2000)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        """阈值范围"""
        #蓝色阈值范围
        blue_lower = np.array([88, 100, 100])
        blue_upper = np.array([115, 255, 255])
        #红色阈值范围
        red_lower = np.array([red_val - 5, 100, 100])
        red_upper = np.array([red_val + 5, 255, 255])
        #黄色阈值范围
        huang_lower = np.array([huang_val - 6 ,100, 100])
        huang_upper = np.array([huang_val + 6 ,255, 255])
        
        # T阈值HSV图像以仅获得所选颜色
        blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
        red_mask = cv2.inRange(hsv, red_lower, red_upper)
        huang_mask = cv2.inRange(hsv, huang_lower, huang_upper)
        # Bitwise-AND屏蔽原始图像
        blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
        red_res = cv2.bitwise_and(frame, frame, mask=red_mask)
        huang_res = cv2.bitwise_and(frame, frame, mask=huang_mask)
        # 结构元素
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
        # 形态学结束
        blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
        red_closing = cv2.morphologyEx(red_res, cv2.MORPH_CLOSE, kernel)
        huang_closing = cv2.morphologyEx(huang_res, cv2.MORPH_CLOSE, kernel)
        # 转换为黑白图像
        blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
        red_gray = cv2.cvtColor(red_closing, cv2.COLOR_BGR2GRAY)
        huang_gray = cv2.cvtColor(huang_closing, cv2.COLOR_BGR2GRAY)
        (thresh1, red_bw) = cv2.threshold(red_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        (thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        (thresh3, huang_bw) = cv2.threshold(huang_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        #只显示蓝色区域,用于测试
        #cv2.imshow("hahaa",red_bw)
        #cv2.waitKey(3000)
        
        blue_black = cv2.countNonZero(blue_bw)
        huang_black = cv2.countNonZero(huang_bw)
        red_black = cv2.countNonZero(red_bw)
        
        if blue_black > 18000 and blue_black>huang_black and blue_black>red_black:#判断二值化像素点个数
     
            print("视频中有蓝色像素")
            
            #如果有蓝色像素则显示蓝色图片
            #label.resize(300,300)
            #label.resize(1200,900)
            self.labelq4.setPixmap(QPixmap("lanse.jpg"))
          #  label.showFullScreen()
            self.labelq4.setScaledContents(True)  # 让图片自适应label大小
            ser.write("1".encode("utf-8"))#如果没有颜色则发送1
        if red_black > 5000  and red_black>huang_black and red_black>blue_black:#判断二值化像素点个数
            print("视频中有红色像素")
    #        label.resize(1200,900)
            #如果有蓝色像素则显示蓝色图片
            self.labelq4.setPixmap(QPixmap("red.jpg"))
        #    label.showFullScreen()
            self.labelq4.setScaledContents(True)  # 让图片自适应label大小
            ser.write("2".encode("utf-8"))#如果没有颜色则发送1
            
            # 完成所有操作后,释放捕获
        if huang_black > 18000 and huang_black>red_black and huang_black>blue_black:#判断二值化像素点个数
     
            print("视频中有黄色像素")
            #label.resize(1200,900)
            #如果有蓝色像素则显示蓝色图片
            self.labelq4.setPixmap(QPixmap("huang.jpg"))
    #        label.showFullScreen()
            self.labelq4.setScaledContents(True)  # 让图片自适应label大小
            ser.write("3".encode("utf-8"))#如果没有颜色则发送1
            # 完成所有操作后,释放捕获
        print("蓝色:",blue_black)
        print("红色:",red_black)
        print("黄色:",huang_black)
        #cap.release()
     
if __name__ == "__main__":
    #标签初始化
    app = QApplication(sys.argv)


    while(True):
        count = ser.inWaiting()  # 位置4		读取返回值
        #print(count)
        if count != 0:
            recv = ser.read(count)  # 位置5
            #如果接受到01则开始识别
            if recv == b"\x01":
                print("dsd")
                a = Demo()
                a.showFullScreen()
                a.show()
                cv2.waitKey(1000)
 
            ser.flushInput()
            time.sleep(0.1)  # 位置8
        cv2.destroyAllWindows()