问题描述
我正在尝试对Perler珠进行颜色检测。硬件正在工作,但是我在软件部分上很挣扎。我正在将Picamera与Raspberry pi A +,opencv和python3配合使用。
这是我到目前为止所拥有的:
from picamera.array import PiRGBArray
from picamera import PiCamera
import numpy as np
import time
import cv2
import serial
ser = serial.Serial(
port='/dev/ttyS0',#Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=1
)
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (1312,976)
camera.framerate = 15
camera.saturation = 0
camera.exposure_compensation = 10
camera.brightness = 50
camera.exposure_mode = 'auto'
rawCapture = PiRGBArray(camera,size=(1312,976))
# allow the camera to warmup
time.sleep(0.1)
# time variable
myTime = 0.25
#Enable motor control
print ("Enable Motors")
ser.write(str.encode('y'))
time.sleep(5)
ser.write(str.encode('hl'))
time.sleep(20)
#define color arrays
colors = [ [(162,192,118),(182,212,198),'Red'],[(105,217,158),(125,237,238),'Blue'],[(16,173,139),(36,193,220),'Yellow'],[(120,164,170),(140,184,250),'Violett'],[(63,245,45),(83,265,125),'Green'],[(-10,165,148),(10,185,228),'Orange'],[(151,70,28),(170,119,108),'Brown'],[(150,197,218),(165,238,248),'Pink'],[(0,79,37),(179,143,73),'Black'],[(44,109,115),(64,132,200),'Lime_Green'],[(72,71),(92,129,151),'Mint_Green'],[(96,186,177),(116,206,257),'Light_Blue'],[(107,227,99),(127,247,179),'Dark_Blue']]
threshold = 5000
#find color function
def findColor(input_image):
img = cv2.imread(input_image,1)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
for color in colors:
low_val,high_val,label = color
mask = cv2.inRange(hsv,low_val,high_val)
if np.sum(mask) > threshold:
return label
return 'undefined' # or a label for 'color not found'
#loop
for x in range(0,500):
camera.capture(rawCapture,format="bgr")
image = rawCapture.array
crop_img = image[350:1000,320:990]
cv2.imwrite('bead.jpg',crop_img)
cv2.imshow("Color",crop_img)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
print (findColor('bead.jpg'))
#No color detected
if findColor('bead.jpg') == 'undefined':
ser.write(str.encode('0'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Red detected
if findColor('bead.jpg') == 'Red':
ser.write(str.encode('1'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Blue detected
if findColor('bead.jpg') == 'Blue':
ser.write(str.encode('2'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Yellow detected
if findColor('bead.jpg') == 'Yellow':
ser.write(str.encode('3'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Violett detected
if findColor('bead.jpg') == 'Violett':
ser.write(str.encode('4'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Green detected
if findColor('bead.jpg') == 'Green':
ser.write(str.encode('5'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Orange detected
if findColor('bead.jpg') == 'Orange':
ser.write(str.encode('6'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Brown detected
if findColor('bead.jpg') == 'Brown':
ser.write(str.encode('7'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Pink detected
if findColor('bead.jpg') == 'Pink':
ser.write(str.encode('8'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Black detected
if findColor('bead.jpg') == 'Black':
ser.write(str.encode('9'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Mint Green detected
if findColor('bead.jpg') == 'Mint_Green':
ser.write(str.encode('a'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Lime_Green detected
if findColor('bead.jpg') == 'Lime_Green':
ser.write(str.encode('b'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Light_Blue detected
if findColor('bead.jpg') == 'Light_Blue':
ser.write(str.encode('c'))
time.sleep(myTime)
ser.write(str.encode('r'))
#Dark_Blue detected
if findColor('bead.jpg') == 'Dark_Blue':
ser.write(str.encode('d'))
time.sleep(myTime)
ser.write(str.encode('r'))
#end color detection
time.sleep(myTime)
首先,我为每个perler磁珠定义了HSV。在每个循环中,我都会拍照并使用“ finColor”功能检查hsv范围。但这还不够可靠。有时,棕色的珠子被认为是黑色的珠子。而且我的代码正在以某种方式工作,但并未真正优化。我不是一个优秀的python程序员,我想问问是否有人可以给我一些技巧来优化我的代码以创建可靠的颜色检测。任何帮助表示赞赏。我在这里上传了所有用不同颜色制作的图像:perler beads images
预先感谢 凯
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)