我有一个人脸检测项目,我想在检测到人脸时激活树莓派pi gpio端口之一,我可以这样做没有任何问题。 现在,我想要一个API,当激活端口时,将json的真实响应发送到客户端。我使用龙卷风Web服务器。
import cv2
import sys
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.output(18,GPIO.HIGH)
cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)
video_capture = cv2.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
if len(faces)>0:
GPIO.output(18,GPIO.LOW)
sleep(1)
GPIO.output(18 ,GPIO.HIGH)
else:
GPIO.output(18,GPIO.HIGH)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# Display the resulting frame
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows(
)
这是我的龙卷风代码:
import face_detection
import tornado.ioloop
import tornado.web
import json
class MainHandler(tornado.web.RequestHandler):
def get(self):
'''face detection code'''
self.write(json.dumps({'response':True}))
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
但是我无法将json响应发送到client.wahts我的代码错误吗?
答案 0 :(得分:0)
您没有发送正确的标题。对于JSON响应,您需要发送Content-Type
标头以告知客户端这是JSON响应,例如:Content-Type: application/json
。
您现在有两个选择:
1。提供self.write
的原始字典而不是json数据
如果给self.write
一个字典,它将自动将其转换为JSON并设置适当的Content-Type
标头。您不必为此担心。
self.write({'reponse': True}) # pass the dict, not JSON
2。或自行设置标题
如果要手动发送json,则可以自己设置标头,如下所示:
self.set_header('Content-Type', 'application/json')
self.write(json.dumps({'response': True}))