程序改进版,识别红黄蓝,窗口发送接收完成,自启动完成。
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 = 0 huang_val = 30 ser = serial.Serial("/dev/ttyAMA0",9600) # 位置1 ser.flushInput() # 位置2 #标签初始化 app = QApplication(sys.argv) label = QLabel() label.setPixmap(QPixmap("123.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大 #cv2.waitKey(10000) def shibie(): #cap = cv2.VideoCapture(0) lanse_jiance() def lanse_jiance(): cap = cv2.VideoCapture(0) ret, frame = cap.read() # get a frame #frame = cv2.imread("home\pi\lanse.jpg") cv2.imshow("haha",frame) cv2.waitKey(2000) 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 - 10, 100, 100]) red_upper = np.array([red_val + 10, 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",huang_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("视频中有蓝色像素") ser.write("1".encode("utf-8"))#如果没有颜色则发送1 #如果有蓝色像素则显示蓝色图片 label.setPixmap(QPixmap("lanse.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 else: ser.write("2".encode("utf-8"))#如果没有颜色则发送2 #没有蓝色则显示原始图像 label.setPixmap(QPixmap("123.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 if red_black > 5000:#判断二值化像素点个数 print("视频中有红色像素") ser.write("1".encode("utf-8"))#如果没有颜色则发送1 #如果有蓝色像素则显示蓝色图片 label.setPixmap(QPixmap("lanse.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 else: ser.write("2".encode("utf-8"))#如果没有颜色则发送2 #没有蓝色则显示原始图像 label.setPixmap(QPixmap("123.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 # 完成所有操作后,释放捕获 if huang_black > 5000:#判断二值化像素点个数 print("视频中有黄色像素") ser.write("1".encode("utf-8"))#如果没有颜色则发送1 #如果有蓝色像素则显示蓝色图片 label.setPixmap(QPixmap("lanse.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 else: ser.write("2".encode("utf-8"))#如果没有颜色则发送2 #没有蓝色则显示原始图像 label.setPixmap(QPixmap("123.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 # 完成所有操作后,释放捕获 print("蓝色:",blue_black) print("红色:",red_black) print("黄色:",huang_black) cap.release() if __name__ == "__main__": while(True): count = ser.inWaiting() # 位置4 读取返回值 #print(count) if count != 0: recv = ser.read(count) # 位置5 #如果接受到01则开始识别 if recv == b"\x01": print(recv) shibie() 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 = 30 ser = serial.Serial("/dev/ttyAMA0",9600) # 位置1 ser.flushInput() # 位置2 #标签初始化 app = QApplication(sys.argv) label = QLabel() label.setPixmap(QPixmap("lvse.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大 #cv2.waitKey(10000) def shibie(): #cap = cv2.VideoCapture(0) lanse_jiance() def lanse_jiance(): cap = cv2.VideoCapture(0) ret, frame = cap.read() # get a frame #frame = cv2.imread("home\pi\lanse.jpg") cv2.imshow("haha",frame) cv2.waitKey(2000) 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.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.setPixmap(QPixmap("red.jpg")) label.show() #label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 ser.write("2".encode("utf-8"))#如果没有颜色则发送1 # 完成所有操作后,释放捕获 if huang_black > 2000000:#判断二值化像素点个数 print("视频中有黄色像素") #如果有蓝色像素则显示蓝色图片 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__": while(True): count = ser.inWaiting() # 位置4 读取返回值 #print(count) if count != 0: recv = ser.read(count) # 位置5 #如果接受到01则开始识别 if recv == b"\x01": print(recv) shibie() 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 = 30 ser = serial.Serial("/dev/ttyAMA0",9600) # 位置1 ser.flushInput() # 位置2 #标签初始化 app = QApplication(sys.argv) label = QLabel() #label.resize(900,900) label.setPixmap(QPixmap("lvse.jpg")) label.show() label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大 #cv2.waitKey(10000) def shibie(): #cap = cv2.VideoCapture(0) lanse_jiance() def lanse_jiance(): cap = cv2.VideoCapture(0) ret, frame = cap.read() # get a frame #frame = cv2.imread("home\pi\lanse.jpg") cv2.imshow("haha",frame) cv2.waitKey(2000) 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.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.setPixmap(QPixmap("red.jpg")) label.show() label.showFullScreen() label.setScaledContents(True) # 让图片自适应label大小 ser.write("2".encode("utf-8"))#如果没有颜色则发送1 # 完成所有操作后,释放捕获 if huang_black > 2000000:#判断二值化像素点个数 print("视频中有黄色像素") #如果有蓝色像素则显示蓝色图片 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__": while(True): count = ser.inWaiting() # 位置4 读取返回值 #print(count) if count != 0: recv = ser.read(count) # 位置5 #如果接受到01则开始识别 if recv == b"\x01": print(recv) shibie() cv2.waitKey(1000) ser.flushInput() time.sleep(0.1) # 位置8 cv2.destroyAllWindows()