mercoledì 11 luglio 2012

Proiezioni stereografiche per geologia strutturale

In questo post viene proposto un programma  per disegnare le proiezioni stereografiche di utilizzo in geologia stratigrafica

Per prima cosa si deve calcolare l'intersezione del piano di cui si e' effettuata la misura (strato o discontinuita')  con una sfera a centro (0,0,1) e raggio1; per fare cio' viene calcolato l'equazione del cerchio dell'equatore che poi viene ruotato dei corrispondenti valori di Strike e Dip
Dopo di cio' viene applicata la formula della proiezione stereografica per riportare i risultati sul piano di proiezione

----------------------
import pygame
import math

pygame.init()
screen = pygame.display.set_mode((300,300))

gamma = -math.pi # variabile per generare il cerchio massimo

teta = math.radians(90)   # angolo di dip
alfa = math.radians(159)  # angolo di strike

raggio = 100
raggio2 = 50

pygame.draw.circle(screen,(255,0,0),(150,150),raggio,1)

while True:
    while gamma < (math.pi):
        #calcola il cerchio come con il centro in 0,0,1 e parallelo ad XY
        #in pratica calcola l'equatore come cerchio massimo
        x = math.cos(gamma)
        y = math.sin(gamma)
        z = 0
        #ruota il cerchio dell'equatore sull'asse x dell'angolo di pendenza (dip)
        x1 = x
        y1 = ((math.cos(teta)*y)-(math.sin(teta)*z))
        z1 = ((math.sin(teta)*y)+(math.cos(teta)*z))
        #ruota il cerchio dell'equatore del valore di azimuth
        x2 = ((math.cos(alfa)*x1)-(math.sin(alfa)*y1))
        y2 = ((math.sin(alfa)*x1)+(math.cos(alfa)*y1))
        z2 = 1+z1 #sposta l'origine della sfera a 0,0,1 per preparare la proiezione stereografica
        #proiezione stereografica
        if (z2<1): # per convenzione si plottano solo le intersezioni con la semisfera inferiore
            x3 = (2*x2)/(2-z2)
            y3 = (2*y2)/(2-z2)
            screen.set_at((int(x3*raggio2)+150,int(y3*raggio2)+150),(0,255,0))
        gamma = gamma+0.01
    pygame.display.flip()

----------------------
Strike 159 - Dip 90

Strike 270 - Dip45

Strike 32 - Dip12

lunedì 9 luglio 2012

Sensori via Arduino Ethernet

 Questo programma mostra un esempio di come utilizzare una Arduino Ethernet per leggere i valori di alcuni sensori (su protocollo I2C o direttamente con input analogico) e mostrare il risultato su una pagina Web che si aggiorna una volta al secondo

--------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

Booster

 Un programma misto Arduino/Python per controllare da un joystick collegato ad un portatile dei servo motori pilotati da Arduino

Parte Arduino Ethernet
--------------------------------------------------------------------
#include <SPI.h>        
#include <Ethernet.h>
#include <Udp.h>       
#include <Servo.h>
#include <string.h>
#include <stdlib.h>


byte mac[] = {0xDE, 0xAD, 0xBF, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,3 };

unsigned int localPort = 8888;      // local port to listen on

byte remoteIp[4];        // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

Servo m1; //destra
Servo m2; //sinistra
Servo m3; //prua
Servo m4; //poppa

int val;

void setup() {
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  m1.attach(3); // collega motore destro
  m2.attach(5); // collega motore sinistro
  m3.attach(6); // collega motore prua;
  m4.attach(9); // collega motore poppa 

  pinMode(7,OUTPUT); // collega Luce 1
  pinMode(8,OUTPUT); // collega Luce 1
  //pinMode(4,OUTPUT); // collega Luce 1
  //pinMode(7,OUTPUT); // collega Luce 1
 
  Serial.begin(9600);
}

void loop() {
  char *p, *i;
  int potenza1, potenza2, potenza3, potenza4;
  int l1, l2, l3, l4;

  int packetSize = Udp.available();

  if(packetSize)
  {
    packetSize = packetSize - 8;    
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    //Serial.println(packetBuffer);
    p = strtok_r(packetBuffer,":",&i);
    int asse = atoi(p);
    Serial.print(asse);
    Serial.print(" = ");
  
   
    p = strtok_r(NULL,":",&i);
    potenza1 = 0;
    potenza1 = atoi(p);
    Serial.print("M1 = ");
    Serial.println(potenza1);

    p = strtok_r(NULL,":",&i);
    potenza2 = 0;
    potenza2 = atoi(p);
    Serial.print("M2 = ");
    Serial.println(potenza2);

    p = strtok_r(NULL,":",&i);
    potenza3 = 0;
    potenza3 = atoi(p);
    Serial.print("M3 = ");
    Serial.println(potenza3);

    p = strtok_r(NULL,":",&i);
    potenza4 = 0;
    potenza4 = atoi(p);
    Serial.print("M4 = ");
    Serial.println(potenza4);

    //luci
    p = strtok_r(NULL,":",&i);
    l1 = 0;
    l1 = atoi(p);
    Serial.print("L1 = ");
    Serial.println(l1);   
    if (l1 == 1)
      {
        val = digitalRead(7);
        if (val == HIGH)
            {
              digitalWrite(7,LOW);
            }
            else
            {
              digitalWrite(7,HIGH);
            }
           
      }

    p = strtok_r(NULL,":",&i);
    l2 = 0;
    l2 = atoi(p);
    Serial.print("L2 = ");
    Serial.println(l2);
    if (l2 == 1)
      {
        val = digitalRead(7);
        if (val == HIGH)
            {
              digitalWrite(7,LOW);
            }
            else
            {
              digitalWrite(7,HIGH);
            }
           
      }

    p = strtok_r(NULL,":",&i);
    l3 = 0;
    l3 = atoi(p);
    Serial.print("L3 = ");
    Serial.println(l3);
    if (l3 == 1)
      {
        val = digitalRead(8);
        if (val == HIGH)
            {
              digitalWrite(8,LOW);
            }
            else
            {
              digitalWrite(8,HIGH);
            }
           
      }

   
    p = strtok_r(NULL,":",&i);
    l4 = 0;
    l4 = atoi(p);
    Serial.print("L4 = ");
    Serial.println(l4);
    if (l4 == 1)
      {
        val = digitalRead(8);
        if (val == HIGH)
            {
              digitalWrite(8,LOW);
            }
            else
            {
              digitalWrite(8,HIGH);
            }
           
      }

   
    m1.write(potenza1);
    delay(50);
    m2.write(potenza2);
    delay(50);
    m3.write(potenza2);
    delay(50);
    m4.write(potenza4);
    delay(50);


  }
 
  delay(100);
}

--------------------------------------------------------------------

Parte PC
--------------------------------------------------------------------
import pygame
import pygcurse
import socket
from time import sleep

pygame.init()
win = pygcurse.PygcurseWindow(40, 25, 'Rov Controller')

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

j = pygame.joystick.Joystick(0)
j.init()

speed = 10

try:
    while True:
        pygame.event.pump()

    l1 = int(j.get_button(4))
    l2 = int(j.get_button(5))
    l3 = int(j.get_button(6))
    l4 = int(j.get_button(7))

    if (int(j.get_button(0)) == 1):
        speed = 10
    if (int(j.get_button(1)) == 1):
        speed = 20
    if (int(j.get_button(2)) == 1):
        speed = 30


    win.write("Mult speed :     ", x=2, y=9)
    win.write("Mult speed : "+str(speed), x=2, y=9)

    win.write("Luce 1 : "+str(l1), x=2,y=10)
    win.write("Luce 2 : "+str(l2), x=2,y=11)
    win.write("Luce 3 : "+str(l3), x=2,y=12)
    win.write("Luce 4 : "+str(l4), x=2,y=13)

    #sinistra/destra
    if (int(j.get_button(3)) == 1):
        m1 = 90-int((j.get_axis(0)*speed))
        m2 = 90+int((j.get_axis(0)*speed))
    else:
    #avanti/indietro
        m1 = 90+int((j.get_axis(2)*speed))
        m2 = 90+int((j.get_axis(2)*speed))

    #alto/basso
    m3 = 90+int((j.get_axis(1)*speed))
    m4 = 90+int((j.get_axis(1)*speed))


    win.write("M 1 :    ", x=2,y=14)
    win.write("M 2 :    ", x=2,y=15)
    win.write("M 3 :    ", x=2,y=16)
    win.write("M 4 :    ", x=2,y=17)
    win.write("M 1 : "+str(m1), x=2,y=14)
    win.write("M 2 : "+str(m2), x=2,y=15)
    win.write("M 3 : "+str(m3), x=2,y=16)
    win.write("M 4 : "+str(m4), x=2,y=17)


    sock.sendto("1:"+str(m1)+":"+str(m2)+":"+str(m3)+":"+str(m4)+":"+str(l1)+":"+str(l2)+":"+str(l3)+":"+str(l4)+":0",("192.168.1.3",8888))


    sleep(0.3)
   
except KeyboardInterrupt:
    j.quit()

------------------------------------------

Salvare con formati utente in VLC

In VLC e' possibile impostare delle modalita' di salvataggio del video in formati non direttamente disponibili

Per fare cio' si deve creare un nuovo profilo dal menu Converti


Ho trovato particolarmente conveniente il seguente metodo basato su un incapsulamento MPEG-TS

ed una traccia video M-JPG

escludendo la traccia audio di cui non ho bisogno

Con queste impostazioni e' possibile salvare e contemporaneamente visualizzare il video da una sorgente esterna anche per computer non particolarmente performanti

Camera SMT-SNP-3120 con PTZ

Recentemente mi e' capitato di lavorare con la telecamera in oggetto che ha uno zoom ottico di 12x con una risoluzione di 795x596 Pixel (reale 704x576 quindi niente di che rispetto alle comuni e economiche webcam 640x480) , autofocus

L'alimentazione viene fornita tramite Ethernet via POE
La rotazione e' di 360° sull'asse orizzontale e di 180° su quello verticale

Il sistema di gestione principale e' costituito da un programma in Silverlight che ovviamente non funziona via Linux (a meno di non rischiare la via Moonlight che francamente ho scartato) .. fortunatamente ci sono un po' di sostituzioni

Per la visualizzazione delle immagini si puo' tranquillamente usare VLC collegato in modalita' rtsp all'indirizzo

rtsp://192.168.1.100/profile2/media.smp

per utilizzare la modalita' PTZ ovvero la possibilita' di muovere la telecamera le cose sono piu' complicate
Sono disponibili dei comandi http

http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100 (il parametro e' un angolo da 0° a 359°)
http://192.168.1.100/cgi-bin/ptz.cgi?movetilt=90 (il parametro e' un angolo da -5° a 185°)
http://192.168.1.100/cgi-bin/ptz.cgi?movezoom=3 (il parametro e' un valore da 1 a 12)

il problema grosso e' che non si puo' creare uno script (per esempio in Python) per muovere la telecamera in quanto in sistema monta un sistema di autenticazione via http che NON e' possibile disattivare (almeno su questo modello di camera)

Di seguito un esempio di codice Python per inviare comandi http che  NON funziona a causa del sistema di autenticazione
--------------------------------------------------------------------
import pygame
import urllib


from pygame import *
pygame.init()
pygame.display.set_mode((500,500),OPENGLBLIT|OPENGL|DOUBLEBUF)
exitt = 0
inte = 4096
while not exitt:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exitt = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_a:

        params = urllib.urlencode({'movepan': '100'})
         url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
        f = urllib.urlopen(url)
      
if event.type == pygame.KEYDOWN and event.key == pygame.K_s:
        params = urllib.urlencode({'movepan': '200'})
         url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
        f = urllib.urlopen(url)

--------------------------------------------------------------------


Come workaround ho installato apache sulla macchina ed ho creato una pagina  fatta di soli link su http://localhost/index.html alle varie funzioni della camera
per esempio

<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100> Pan 100</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=120> Pan 120</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=140> Pan 140</a>



cliccando sul link, se non autenticati, la camera richiede l'autenticazione
In questo modo si sfrutta il browser per gestire il lato autenticazione http






sabato 30 giugno 2012

Salvare un video da VLC

VLC permette di salvare (anche con compressione al volo) lo stream che deriva da una periferica di acquisizione..ovviamente piu' il flusso e' veloce e corposo maggiore e' la richiesta di processore.
Le operazioni da eseguire sono le seguenti

Da VLC selezionare il menu Media/Apri periferica di acquisizione, selezionare il dispositivo di input video e poi in basso accanto a Riproduci cliccare sulla freccia in basso e selezionare Converti (ALT+C)

si apre il menu sottostante in cui si puo' indicare il file da salvare ed il tipo di codifica richiesta
importante per salvare e contemporaneamente visualizzare lo stream e' flaggare Mostra Risultato

con le impostazioni sopra riportate lo stream di una webcam 640x480 del portatile genera un flusso di circa 5Mb per minuto di ripresa quindi decisamente accettabile come occupazione di spazion disco

giovedì 21 giugno 2012

Creazione di amplificatore reale con LM358

 Nel caso reale di costruzione di un amplificatore e' stato utilizzato l'operazionale LM358 per operare una amplificazione di guadagno pari a 2 in modalita' invertente
per questo motivo le due resistenze sull'operazionale sono uguali a pari a 1 KOhm

Il cavo verde indica il segnale da amplificare (sul Pin 3)
Il cavo rosso indica l'uscita del segnale amplificato (sul Pin 1)
Il cavo nero indica la terra (sul Pin 4)

Le resistenza sul circuito di alimentazione dell'integrato sono entrambi da 10 KOhm



Il Pin 1 e' in alto a sinistra (una resistena da 10 KOhm e' parzialmente coperta dal filo verde)
 
L'integrato a sinistra non e' impiegato

Visione complessiva

Change Detection with structural similarity

L'idea di base e' quella di cercare le differenze tra le due immagini sottostanti Non e' immediatamente visibile ma ci sono dei ...