Я пытаюсь выполнить обработку зрения на малине pi и контролировать эффекты на графическом интерфейсе. Использование cv2.imshow действительно снижает частоту кадров, поэтому вместо этого я пытаюсь передать эти операции в локальный сервер MPEG, а затем отслеживать его с хром на другом рабочем столе. Вот код, который я разработал:Python MJPEG Server
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
from threading import Thread
import imutils
import sys
class CamHandler(BaseHTTPRequestHandler):
def do_GET(self):
print(self.path)
if self.path.endswith('/stream.mjpg'):
self.send_response(20)
self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=--jpgboundary')
self.end_headers()
while True:
try:
if(frame != None):
pass
r, buf = cv2.imencode(".jpg", frame)
self.wfile.write("--jpgboundary\r\n".encode())
self.end_headers()
self.wfile.write(bytearray(buf))
except KeyboardInterrupt:
break
return
if self.path.endswith('.html') or self.path == "/":
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write('<html><head></head><body>')
self.wfile.write('<img src="http://localhost:9090/stream.mjpg" height="240px" width="320px"/>')
self.wfile.write('</body></html>')
return
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
class WebcamVideoStream:
def __init__(self, src=0):
# initialize the video camera stream and read the first frame
# from the stream
self.stream = cv2.VideoCapture(src)
# self.stream.set(3, 1920)
# self.stream.set(4, 1080)
# self.stream.set(15,-100)
(self.grabbed, self.frame) = self.stream.read()
# initialize the variable used to indicate if the thread should
# be stopped
self.stopped = False
def start(self):
# start the thread to read frames from the video stream
Thread(target=self.update, args=()).start()
return self
def update(self):
# keep looping infinitely until the thread is stopped
while True:
# if the thread indicator variable is set, stop the thread
if self.stopped:
self.stream.release()
return
# otherwise, read the next frame from the stream
(self.grabbed, self.frame) = self.stream.read()
def read(self):
# return the frame most recently read
return self.frame
def stop(self):
# indicate that the thread should be stopped
self.stopped = True
def realmain():
global frame
ip = 'localhost'
try:
cap = WebcamVideoStream().start()
server = ThreadedHTTPServer((ip, 9090), CamHandler)
print("starting server")
target = Thread(target=server.serve_forever,args=())
i = 0
while True:
img = cap.read()
img1 = imutils.resize(img, width=600)
img2 = cv2.GaussianBlur(img1, (5, 5), 0)
#frame = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
frame = cv2.Canny(img, 35, 125)
if(i == 0):
target.start()
i +=1
except KeyboardInterrupt:
sys.exit()
if __name__ == '__main__':
realmain()
Прямо сейчас, я могу запустить сервер с моего рабочего стола и просматривать MPEG в порядке с хромом на моем рабочем столе, но я не могу запустить сервер из моего Raspberry Pi , и получить к нему доступ, набрав этот URL-адрес: http: // «RASPBERRY PI IP»: 9090/stream.mjpg, на моем рабочем столе. Когда я это делаю, хром просто говорит, что веб-страница недоступна. Даже при запуске сервера на PI я не могу просмотреть URL-адрес в браузере Epiphany, он просто загружает изображение. Было интересно, есть ли у кого-нибудь ответ на эту проблему.
Кроме того, существует ли более быстрый способ распаковать и повторно сжать jpg перед отправкой его на сервер?
Можете ли вы попытаться сделать * ip = "" * (пустая строка) вместо * 'localhost' *? – sal
Спасибо, я на самом деле пробовал сервер на моем телефоне Wi-Fi, и я смог подключиться через свой рабочий стол. Должен быть какой-то брандмауэр, предотвращающий соединение –