Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Duda enorme con Python y Raspberry
#1
A todo aquel interesado en ayudarme, de antemano, gracias. Muchísimas gracias.
Estoy atascado, soy un alumno del curso de ASIR y no tengo ni idea de programación, estoy haciendo el proyecto de fin de grado y he llegado al punto de no retorno para mi, en el que, aunque no me guste, he de pedir ayuda.
Mi intención es hacer un sistema de seguridad en el cual, una webcam, un micrófono y un detector de movimiento (este último curiosamente lo tengo solucionado), estarán conectados a una Raspberry Pi modelo 3B, la imagen de vídeo vaya directamente a una página web en la que se vea y se oiga lo que el micrófono y cámara recojan. Pero no tengo absolutamente ni idea de cómo hacerlo todo.
Para completar al 100% mi proyecto, me gustaría también hacer una aplicación Android en la que poder hacer exactamente lo mismo (bastaría con ver igualmente dicha página web)

Hasta ahora he tenido muchísimos intentos (dos meses de fallos y errores), y por fin me he rendido ante la evidencia de que tengo que pedir ayuda. Los códigos que tengo ahora hechos no me sirven de nada porque siempre me marcan algún que otro error.

Por favor, ayuda...Y gracias de veras.
Responder
#2
Hola Aaron, ¿cómo estás?

Por suerte lo que tienes en mente no es nada de otro mundo. Yo nunca usé Raspberry Pi pero tengo entendido que se comunica muy bien con Python, y operaciones tales como obtener la entrada del micrófono o la cámara son bastante comunes. Enviar esos datos y reproducirlos en una web es tal vez lo más complicado por cuanto excede a Python y tendrás que incluir otros lenguajes (HTML5 y Javascript principalmente); la aplicación de Android puedes tenerla funcionando rápidamente usando un webview que redireccione a tu web, como bien has dicho.

Ahora bien, sin conocimientos de programación la tarea se vuelve complicada. Mi recomendación es que empieces con lo básico de todo lenguaje de programación. En Python, por ejemplo, hay mucha documentación en español (aún más en inglés si no tienes problemas con el idioma). Hace algún tiempo te hubiera recomendado el libro Python para todos, aunque está pensado para Python 2 y lo ideal es que comiences directamente con la última versión de Python 3; no obstante, hay mucho material para rescatar. Buscar algún otro libro o curso online para que puedas tener un dominio de los fundamentos del lenguaje es fundamental.

Espero haberte orientado lo suficiente.

Saludos!
Responder
#3
Pues mira, tengo la página de html5 hecha (que gracias al mundo que lo encontré por internet, porque mi conocimiento de html5 ronda lo básico de cuando lo estudié), siendo este el código que tengo (que al menos funciona, me doy con un canto en los dientes):

Código:
<!DOCTYPE html>
<html>
<head>
 <title>WebCam</title>
</head>
<body>
 <video autoplay controls></video>
 <script type="text/javascript" charset="utf-8" defer>
   navigator.URL = window.URL || window.webkitURL;
   navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

   navigator.getUserMedia(
     {audio:true, video:true},
     function(vid){
       document.querySelector('video').src=window.URL.createObjectURL(vid);
     },
     function(err) {
       console.log("Ocurrió el siguiente error: " + err);
     }
   );
 </script>
</body>
</html>

Lo que hace es visualizar en una página web lo que captura la imagen y el micrófono (habiendo aceptado los permisos, claro. Hecho con Notepad++).

Ahora bien, los códigos que yo tengo de la cámara y el micrófono, directamente, no me sirven. O mejor dicho, no sé como hacer para que funcionen, muestro aquí los ejemplos de lo que tengo:

CÁMARA:
Código:
# Importar urllib para pdoer leer las URL
import urllib
# cv2 para poder importar opencv y numpy para la manipulación de la matriz
import cv2
import numpy as np
# Pegamos la url de la captura de imágenes de la webcam y construimos el bucle
url='http://192.168.132.104:8081/shot.jpg'
while True:
    imgResp=urllib.urlopen(url)
    imgNp=np.array(bytearray(imgResp.read()),dtype=np.uint8)
   img=cv2.imdecode(imgNp,-1)
   cv2.imshow('test',img)
   if ord('q')==cv2.waitKey(10):
       exit(0)
# Dentro del ciclo while se abre la URL usando "urllib.urlopen (ulr)"
# y dará una respuesta con la variable "imgResp"
# En la línea 11 se leen los valores de la respuesta url y se convierte  
# en una matriz de bytes y finalmente pasa a una matriz numpy, la cual
# se almacenará en la variable numpy "imgNp"


MICRÓFONO:
Código:
import pyaudio
import struct
import math
import wave
import numpy as np
import matplotlib.pyplot as plt
# Se importan todas las librerías necesarias: pyaudio, struct, math, wave, numpy y os
from scipy.io import wavfile
import os
# Definimos la clase Microphone y configuramos dicha clase
class Microphone:
   def rms(self,frame):
       count = len(frame)/2
       format = "%dh"%(count)
       shorts = struct.unpack( format, frame )
       sum_squares = 0.0
       for sample in shorts:
           n = sample * (1.0/32768.0)
           sum_squares += n*n
       rms = math.pow(sum_squares/count,0.5);
       return rms * 1000
   def passiveListen(self,persona):
       CHUNK = 1024; RATE = 8000; THRESHOLD = 200; LISTEN_TIME = 5
       didDetect = False
       # Preparamos la transmisión de grabación
       p = pyaudio.PyAudio()
       stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNK)
       # Y almacenamos los datod de audio:
       all =[]
       # Comenzamos el bucle para ahcer la escucha pasiva para posibles disturbios
       print RATE / CHUNK * LISTEN_TIME
       for i in range(0, RATE / CHUNK * LISTEN_TIME):
           input = stream.read(CHUNK)
           rms_value = self.rms(input)
           print rms_value
           if (rms_value => THRESHOLD):
               didDetect = True
               print "Listening...\n"
               break
       if not didDetect:
           stream.stop_stream()
           stream.close()
           return False
       # Se anexan todos los trozos
       all.append(input)
       for i in range(0, 7):
           data = stream.read(CHUNK)
           all.append(data)
       # Y se guardan los trozos de audio parando el servicio, cerrándolo y volviendo al bucle
       data = ''.join(all)
       stream.stop_stream()
       stream.close()
       wf = wave.open('audio.wav', 'wb')
       wf.setnchannels(1)
       wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
       wf.setframerate(RATE)
       wf.writeframes(data)
       wf.close()
       return True
if __name__ == '__main__':
   mic = Microphone()
   while True:
       if  mic.passiveListen('ok Google'):
           fs, data = wavfile.read('audio.wav')
           L = len(data)
           c = np.fft.fft(data) # Crea una lista con números complejos
           freq = np.fft.fftfreq(L)
           print freq
           freq_in_hertz = abs(freq * fs)
           plt.plot(freq_in_hertz, abs(c))
           plt.show()

Y el detector de movimiento, el cual NO voy a hacer la implementación física en mi proyecto porque, sinceramente, paso de gastar más dinero para un aprobado, sería este:

Código:
import RPi.GPIO as GPIO
import time
from time import gmtime, strftime
# Se importan las librerías Rpi.GPIO, time, gmtime y strtime
GPIO.setmode(GPIO.BCM)
PIR_PIN = 7
GPIO.setup(PIR_PIN, GPIO.IN)
# Se han configurado los pines GPIO como BCM, usando el pin 7 de entrada
try:
# Se inicia el bucle infinito que, si hay señal en el pin 7, lo pausa 1 segundo
# se crea una cadena de texto con la hora, se saca por pantalla el mensaje, se
# vuelve a pausar 1 segundo y se vuelve a empezar:
   while True:
       if GPIO.input(PIR_PIN):
           time.sleep(1)
           timex = strftime("%d-%m-%Y %H:%M:%S", gmtime())
           print timex + " MOVIMIENTO DETECTADO"
       time.sleep(1)
# Se hace una salida del script pulsando CONTROL+C
except KeyboardInterrupt:
   print "quit"
   GPIO.cleanup()


El problema viene en que, cuando intento descargar las librerías para el Open CV, la Raspberry me peta. Simple y llanamente, una vez la reinicio no vuelve a cargar Raspbian. Y la verdad, estoy desesperado, sinceramente, no tengo tiempo para ponerme a estudiar Python, egoístamente pido una solución ante mi ignorancia.
Si alguien me puede aconsejar...Lo agradecería de verdad. Sad
Responder
#4
No sabría decirte cuál es el problema sin tener un dispositivo con el que probar el código. Seguramente encuentres más ayuda en el foro de Raspberry en español: https://www.raspberrypi.org/forums/viewforum.php?f=76.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)