You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
item-sort/run_detect.py

140 lines
5.6 KiB
Python

#!/usr/bin/python
import detect
import timeit
import cv2
import socket
import time
from imutils.video import FPS
calibration_width = 0.75
image = "img7.jpg"
images = ("img.jpg", "img3.jpg", "img4.jpg", "img5.jpg", "img6.jpg", "img7.jpg", "img8.jpg")
#images = ("img.jpg", "img2.jpg")
video = True
def go():
for file in images:
items,output = detect.detect(calibration_width, file, True, False)
print(str(items))
if "Penny" in items:
items.remove("Penny")
itema = items[0]
valid = True
for item in items:
if item != itema:
print("Too many items!")
valid = False
break
if valid:
print("Found " + itema)
#selectedBin = sort.sort(itema)
#control_motor.goToBin(selectedBin)
def sendString(string):
print("[ INFO ] Sending message: " + string)
try:
conn.sendall(string.encode('utf-8'))
except socket.error:
print("[ EXIT ] Socket connection error.")
if not video:
elapsed_time = timeit.timeit(go, number=1)/1
print(elapsed_time)
else :
#capture = cv2.VideoCapture('tcpclientsrc port=5000 host=192.168.1.129 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! videorate ! video/x-raw,framerate=5/1 ! appsink', cv2.CAP_GSTREAMER)
#capture = cv2.VideoCapture('tcpclientsrc host=192.168.1.129 port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! autovideosink sync=false', cv2.CAP_GSTREAMER)
capture = cv2.VideoCapture('udpsrc port=9000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! appsink sync=false', cv2.CAP_GSTREAMER)
host = '' # Symbolic name meaning all available interfaces
port = 9001 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#s.setsockopt(s, socket.SOL_SOCKET, socket.SO_REUSEADDR)
s.bind((host, port))
print("[ INFO ] TCP stream initialized. Waiting for client...")
s.listen(1)
conn, addr = s.accept()
print('[ INFO ] Connected to ', addr)
time.sleep(2)
waitForPi = True
while waitForPi is True:
try:
print("[ INFO ] Waiting for confirmation message.")
data = conn.recv(1024)
if not data: break
encoding = 'utf-8'
print ("[ INFO ] Message recieved: "+str(data))
waitForPi = False
except socket.error:
print("[ EXIT ] Socket connection error.")
break
# server command for imx135 camera ./video2stdout | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.43.152 port=5001
# server command for udp: ./video2stdout | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=192.168.43.40 port=9000
x = 0
currentItem = ""
samples = 0
intake = False
while True:
ret = capture.grab()
x+=1
if not ret:
print('[ EXIT ] Empty frame received.')
break
#print('frame')
if x > 1:
ret,frame = capture.retrieve()
frame = frame[300:1080, 300:1620]
#frame = frame[170:900, 475:1100]
items,output = detect.detect(calibration_width, frame, True, True)
cv2.imshow('Item Sorter', output)
x = 0
if len(items) > 0:
#items.remove("Penny")
if intake is True:
sendString("Pause ")
intake = False
itema = items[0]
valid = True
for item in items:
if item != itema:
#print("[ INFO ] More than one object present.")
valid = False
break
if valid:
if currentItem == itema:
samples += 2
else:
currentItem = itema
samples = 0
if samples >= 10:
samples = 0
capture.release()
time.sleep(2)
sendString(currentItem)
waitForPi = True
while waitForPi is True:
try:
data = conn.recv(1024)
if not data: break
#print(str(data))
if str(data) == "b'Continue'":
waitForPi = False
capture = cv2.VideoCapture('udpsrc port=9000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! appsink sync=false', cv2.CAP_GSTREAMER)
print("[ INFO ] Waiting for the next item")
except socket.error:
print("[ EXIT ] Socket connection error.")
break
else:
if samples > 0:
samples -= 1
if samples == 0 and intake is False:
sendString("Intake")
intake = True
time.sleep(0.25)
if cv2.waitKey(1)&0xFF == ord('q'):
print("[ EXIT ] Shutting down.")
s.shutdown(1)
s.close()
break