功能:可以根据是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()