카테고리 없음
[미완성, 코드만 업로드] 네트워크/통신 Jetson Nano 와 데스크탑 통신
seowit
2021. 2. 26. 10:56
<!-- templates/layout.html -->
<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
<h1>GoQba</h1>
<div class=metanav>
{% if not session.logged_in %}
<a href="{{ url_for('login') }}">log in</a>
{% else %}
<a href="{{ url_for('logout') }}">log out</a>
{% endif %}
</div>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
{% block body %}
{% endblock %}
</div>
<!-- templates/login.html -->
{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=password name=password>
<dd><input type=submit value=Login>
</dl>
</form>
{% endblock %}
<!-- templates/show_entries.html -->
{% extends "layout.html" %}
{% block body %}
{% if session.logged_in %}
<form action="{{ url_for('add_entry') }}" method=post class=add-entry>
<dl>
<dt>Title:
<dd><input type=text size=30 name=obj>
<dt>Text:
<dd><textarea name=num rows=1 cols=30></textarea>
<dd><input type=submit value=Share>
</dl>
</form>
{% endif %}
<ul class=entries>
{% for entry in entries %}
<li><h2>{{ entry.obj }}</h2>{{ entry.num|safe }}
{% else %}
<li><em>Unbelievable. No entries here so far</em>
{% endfor %}
<div>
<h3 >Live Streaming</h3>
<img src="{{ url_for('video_feed') }}" width="100%">
</div>
{% endblock %}
<!-- templates/session.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chat Room</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
var sock = io.connect('http://127.0.0.1:9999');
sock.on('connect', function(){
var connect_string = 'new_connect';
sock.send(connect_string);
});
sock.on('hello', function(msg){
$('#messages').append('<li>' +'>>Hello :'+ msg + '</li>');
console.log('Received Hello Message');
});
sock.on('message', function(msg){
// console.log(type(msg));
if(msg.type === 'normal'){
$('#messages').append('>> '+msg.message+'<br>');
}else{
$('#messages').append('<li>' + msg.message + '</li>');
}
console.log('Received Message : '+msg.type);
});
$('#sendbutton').on('click', function(){
sock.send($('#myMessage').val());
$('#myMessage').val('');
});
});
</script>
<ul id="messages"></ul>
<input type="text" id="myMessage">
<button id="sendbutton">Send</button>
</body>
</html>
/* static/style.css*/
body { font-family: sans-serif; background: #eee; }
a, h1, h2 { color: #377BA8; }
h1, h2 { font-family: 'Georgia', serif; margin: 0; }
h1 { border-bottom: 2px solid #eee; }
h2 { font-size: 1.2em; }
.page { margin: 2em auto; width: 35em; border: 5px solid #ccc;
padding: 0.8em; background: white; }
.entries { list-style: none; margin: 0; padding: 0; }
.entries li { margin: 0.8em 1.2em; }
.entries li h2 { margin-left: -1em; }
.add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl { font-weight: bold; }
.metanav { text-align: right; font-size: 0.8em; padding: 0.3em;
margin-bottom: 1em; background: #fafafa; }
.flash { background: #CEE5F5; padding: 0.5em;
border: 1px solid #AACBE2; }
.error { background: #F0D6D6; padding: 0.5em; }
## admin.py
from __future__ import with_statement
from contextlib import closing
import sqlite3
import cv2
from imutils.video import VideoStream
import imutils
import time
#from camera import VideoCamera
from camera_test import VideoCamera
import socket
import numpy as np
from flask import Flask, request, session, g, redirect, url_for, \
abort, render_template, flash, Response
# configuration
DATABASE = '/tmp/admin_page.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'
# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)
# socket_io=SocketIO(app)
def gen(camera_test):
frame = camera_test.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
# while True:
# #get camera frame
# frame = camera_test.get_frame()
# yield (b'--frame\r\n'
# b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
# @app.route('/video_feed')
# def video_feed():
# return Response(gen(VideoCamera()),
# mimetype='multipart/x-mixed-replace; boundary=frame')
# def gen_frames():
# while True:
# success, frame = camera.read() # read the camera frame
# if not success:
# break
# else:
# ret, buffer = cv2.imencode('.jpg', frame)
# frame = buffer.tobytes()
# yield (b'--frame\r\n'
# b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# @app.route('/video_feed')
# def video_feed():
# return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read().decode('utf-8'))
db.commit()
def connect_db():
return sqlite3.connect(app.config['DATABASE'])
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
@app.route('/')
def show_entries():
cur = g.db.execute('select obj, num from entries order by id desc')
entries = [dict(obj=row[0], num=row[1]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries)
# @app.route('/')
# def show_entries():
# cur = g.db.execute('select title, text from entries order by id desc')
# entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
# return render_template('show_entries.html', entries=entries)
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into entries (obj, num) values (?, ?)',
[request.form['obj'], request.form['num']])
g.db.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('Hi, '+request.form['username']+'! You were logged in ;)')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries'))
if __name__ == '__main__':
#socket_io.run(app, port=9999, debug=True)
app.run(host='0.0.0.0', debug=True)
# app.run(debug=True)
## camera_test.py
import socket
import numpy as np
import cv2
def recvall(sock, count):
buf = b''
while count:
newbuf = sock.recv(count)
if not newbuf: return None
buf += newbuf
count -= len(newbuf)
return buf
HOST = '192.168.87.103'
PORT = 9999
class VideoCamera(object):
def __init__(self):
self.client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.client_socket.connect((HOST, PORT))
def __del__(self):
self.client_socket.close()
def get_frame(self):
# while True:
message = '1'
self.client_socket.send(message.encode())
length = recvall(self.client_socket,16)
stringData = recvall(self.client_socket, int(length))
data = np.frombuffer(stringData, dtype='uint8')
return stringData
# decimg=cv2.imdecode(data,1)
# cv2.imshow('Image',decimg)
# key = cv2.waitKey(1)
# if key == 27:
# break
# #extracting frames
# ret, frame = self.video.read()
# frame=cv2.resize(frame,None,fx=ds_factor,fy=ds_factor,
# interpolation=cv2.INTER_AREA)
# gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# face_rects=face_cascade.detectMultiScale(gray,1.3,5)
# for (x,y,w,h) in face_rects:
# cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
# break
# # encode OpenCV raw frame to jpg and displaying it
# ret, jpeg = cv2.imencode('.jpg', frame)
# return jpeg.tobytes()
## camera.py 본인 카메라
# import the necessary packages
import cv2
# defining face detector
face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
ds_factor=0.6
class VideoCamera(object):
def __init__(self):
#capturing video
self.video = cv2.VideoCapture(0)
# def __del__(self):
# #releasing camera
# self.video.release()
def get_frame(self):
#extracting frames
ret, frame = self.video.read()
frame=cv2.resize(frame,None,fx=ds_factor,fy=ds_factor,
interpolation=cv2.INTER_AREA)
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
face_rects=face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in face_rects:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
break
# encode OpenCV raw frame to jpg and displaying it
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()