Untuk instalasi gunakan perintah berikut di terminal.
Untuk memperbarui linux.
BukaCV. Ini adalah versi 2.4.9.1 yang tidak mutakhir, tetapi berfungsi dengan baik.
Jika Anda ingin mengkompilasi OpenCV dari sumbernya, saya menemukan tutorial ini.
Instal PySerial.
Kami mengubah izin port serial, jika Anda menggunakan USB atau asli.
Menjalankan skrip python (mengubah nol jika Anda memiliki lebih dari satu sumber video, ini akan memilih sumber).
Untuk sedikit meningkatkan kinerja, gambar yang diambil tidak ditampilkan jika Anda ingin melihatnya, Anda harus mencari dan menghapus komentar pada baris ini.
Umpan balik dan peningkatan dipersilakan.
Kode
- faceser.py
- Car.ino
- scanlinux.py
faceser.pyPython
Python scrip OpenCV face traking#!/usr/bin/python"""Program ini adalah demonstrasi untuk deteksi wajah dan objek menggunakan fitur seperti haar.Program ini menemukan wajah dalam gambar kamera atau aliran video dan menampilkan kotak merah di sekitarnya, lalu pusatkan webcam melalui dua servo sehingga wajah berada di tengah layarBerdasarkan facedetect.py di direktori sampel OpenCV"""import sysfrom optparse import OptionParserimport serialimport cv2.cv as cvimport time# Parameter untuk deteksi haar# Dari API:# Parameter default (scale_factor=2, min_neighbors=3, flags=0) disetel# untuk deteksi objek yang akurat namun lambat. Untuk operasi yang lebih cepat pada video nyata# gambar, pengaturannya adalah:# scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING,# min_size=>> servo.move(2, 90) ... # "move servo #2 hingga 90 derajat"''' if (min_pwm <=angle <=max_pwm):ser.write(chr(255)) ser.write(chr(servo)) ser.write(chr(angle)) else:print "Servo sudut harus bilangan bulat antara 0 dan 180.\n"if __name__ =='__main__':ser=serial.Serial(port='/dev/ttyUSB0',baudrate=115200,timeout=1) #ser=serial.Serial (port='/dev/ttyS0',baudrate=115200,timeout=1) #ser=serial.Serial(port='COM14',baudrate=115200,timeout=1) # parse opsi baris cmd, atur Haar classifier parser =OptionParser(penggunaan ="penggunaan:%prog [opsi] [camera_index]") parser.add_option("-c", "--cascade", action="store", dest="cascade", type="str", help="Haar cascade file, default %default", default ="./haarcascade_frontalface_alt.xml") (options, args) =parser.parse_args() cascade =cv.Load(options.cascade) if len(args) !=1:parser.print_help() sys.exit(1) input_name =arg s[0] if input_name.isdigit():capture =cv.CreateCameraCapture(int(input_name)) cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, 320) cv.SetCaptureProperty(capture, cv.CV_CAP_CAP_PROP_FRAME)else print, " s[0] Kami membutuhkan masukan kamera! Tentukan indeks kamera mis. 0" sys.exit(0) # cv.NamedWindow("result", 1) if capture:frame_copy =Tidak ada gerakan(panGpioPin, servoPanPosition) move(tiltGpioPin, servoTiltPosition) while True:start =time.time() frame =cv .QueryFrame(capture) jika bukan frame:cv.WaitKey(0) break jika bukan frame_copy:frame_copy =cv.CreateImage((frame.width,frame.height), cv.IPL_DEPTH_8U, frame.nChannels) jika frame.origin ==cv.IPL_ORIGIN_TL:cv.Copy(frame, frame_copy) else:cv.Flip(frame, frame_copy, 0) midScreenX =(frame.width/2) midScreenY =(frame.height/2) midFace =detect_and_draw(frame_copy, cascade) jika midFace bukan Tidak ada:midFaceX =midFace[0] midFaceY =midFace[1] #Cari tahu apakah komponen X dari wajah berada di kiri tengah layar. if(midFaceX <(midScreenX - midScreenWindow)):#Perbarui variabel posisi pan untuk menggerakkan servo ke kanan servoPanPosition +=panStepSize print str(midFaceX) + "> " + str(midScreenX) + " :Pan Right :" + str(servoPanPosition) #Cari tahu apakah X komponen wajah adalah ke r ight dari tengah layar. elif(midFaceX> (midScreenX + midScreenWindow)):#Update variabel posisi pan untuk memindahkan servo ke kiri. servoPanPosition -=panStepSize print str(midFaceX) + " <" + str(midScreenX) + " :Pan Left :" + str(servoPanPosition) else:print str(midFaceX) + " ~ " + str(midScreenX) + " :" + str(servoPanPosition) servoPanPosition =min(servoPanPosition, max_pwm) servoPanPosition =max(servoPanPosition, min_pwm) move(panGpioPin, servoPanPosition) #Cari tahu apakah komponen Y dari wajah berada di bawah tengah layar. if(midFaceY <(midScreenY - midScreenWindow)):if(servoTiltPosition <=90):#Perbarui variabel posisi kemiringan untuk menurunkan servo kemiringan. servoTiltPosition -=tiltStepSize print str(midFaceY) + "> " + str(midScreenY) + " :Tilt Down :" + str(servoTiltPosition) #Cari tahu apakah komponen Y dari wajah berada di atas tengah layar. elif(midFaceY> (midScreenY + midScreenWindow)):if(servoTiltPosition>=1):#Perbarui variabel posisi kemiringan untuk menaikkan servo kemiringan. servoTiltPosition +=tiltStepSize print str(midFaceY) + " <" + str(midScreenY) + " :Tilt Up :" + str(servoTiltPosition) start =1; akhir =1; lain:print str(midFaceY) + " ~ " + str(midScreenY) + " :" + str(servoTiltPosition) servoTiltPosition =min(servoTiltPosition, max_pwm) servoTiltPosition =max(servoTiltPosition, min_pwm) move(tiltGpioPin) else:#Position servo akhir pengukuran waktu end =time.time()+0.1 var +=0.1 # mendapatkan waktu yang telah berlalu time_elapsed =int(end - start + var) # informasi pencetakan print 'time elapsed:\t{}'.format(time_elapsed) print ' var:\t{}'.format(var) if time_elapsed ==20:move(3, servoTiltPosition) servoPanPosition =90 servoTiltPosition =45 var=0; if cv.WaitKey(1)>=0:# 1ms delay break #cv.DestroyWindow("result")
Car.inoArduino
#include #define MA_1 2#define MA_2 3#define MB_1 4#define MB_2 5#define MC_1 6#define MC_2 7#define MD_1 8#define MD_2 9#define SERVOX_PIN 11#define SERVOY_PIN 10 #define trigPin 13#define echoPin 12// Input pengguna untuk servo dan posisiServo servo;Servo servox;int x =90, prevX;int y =45, prevY;int userInput[3]; // input mentah dari buffer serial, 3 byte startbyte; // mulai byte, mulai membaca inputint servo; // servo mana yang akan di pulse?int pos; // sudut servo 0-180int i; // iteratorint State =LOW;unsigned long beforeMillis =0 , val =100;;const long interval =100;bool scana =false;unsigned long currentMillis;void setup() { inicializate(); currentMillis =milis();}void loop() { // Tunggu input serial (min 3 byte dalam buffer) if (Serial.available()> 2) { // Baca byte pertama startbyte =Serial.read(); // Jika itu benar-benar byte awal (255) ... if (byte awal ==255) { // ... lalu dapatkan dua byte berikutnya untuk (i =0; i <2; i++) { userInput[i] =Serial.baca(); } // Byte pertama =servo bergerak? servo =masukan pengguna[0]; // Byte kedua =posisi yang mana? pos =masukan pengguna[1]; // Pengecekan dan pemulihan kesalahan paket jika (pos ==255) { servo =255; } // Tetapkan posisi baru ke sakelar servo (servo) yang sesuai { kasus 1:servoy.write(pos); // pindahkan servo1 ke 'pos' break; kasus 2:servox.write(pos); kisaran (pos); merusak; kasus 3:pindai (45); pindai (65); merusak; default:istirahat; } } }}void scan(int val) { while (Serial.available() ==0) { servoy.write(val); unsigned long currentMillis =milis(); if (Millis saat ini - Mili sebelumnya>=interval) { Mili sebelumnya =Milis saat ini; servox.write(pos); if (Status ==RENDAH ) { pos +=1; if (pos ==130) { Status =TINGGI; } } else { pos -=1; if (pos ==40) { Status =RENDAH; merusak; } } } }}jarak jauh() { durasi panjang, jarak; digitalWrite(trigPin, RENDAH); // Menambahkan baris ini delayMicroseconds(2); // Menambahkan baris ini digitalWrite(trigPin, HIGH); delayMicroseconds(10); // Menambahkan baris ini digitalWrite(trigPin, LOW); durasi =pulseIn(echoPin, TINGGI); jarak =(durasi / 2) / 29.1; return distance;}void range(int pos) { if ((pos>=80 ) &(pos <=100)) { move(); } else if ((pos>=100 ) &(pos <=180)) { kiri(); penundaan (10); Berhenti(); } else if ((pos>=1 ) &(pos <=80)) { kanan(); penundaan (10); Berhenti(); }}void move() { jarak jauh, jarak sebelumnya; jarak =jarak(); if (val <=80) { terbalik(); penundaan (50); Berhenti(); } else if (val>=140) { maju(); penundaan (50); Berhenti(); } if (jarak>=jarak sebelumnya) { val =(jarak - jarak sebelumnya); } else if (jarak <=jarak sebelumnya) { val =(jarak sebelumnya - jarak); } sebelumnyadistance =jarak;}kosongkan inicializate() { Serial.begin(115200); pinMode(MA_1, OUTPUT); pinMode(MA_2, OUTPUT); pinMode(MB_1, OUTPUT); pinMode(MB_2, OUTPUT); pinMode(MC_1, OUTPUT); pinMode(MC_2, OUTPUT); pinMode(MD_1, OUTPUT); pinMode(MD_2, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); servox.attach(SERVOX_PIN); servoy.attach(SERVOY_PIN);}void forward() { digitalWrite(MA_1, HIGH); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, LOW);}tidak berlaku sebaliknya () { digitalWrite(MA_1, LOW); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, HIGH);}batalkan kanan() { digitalWrite(MA_1, LOW); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, LOW);}kosongkan kiri() { digitalWrite(MA_1, HIGH); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, HIGH);}void Stop() { digitalWrite(MA_1, LOW); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, RENDAH);}void StopH() { digitalWrite(MA_1, TINGGI); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, HIGH);}
scanlinux.pyPython
Pindai port serial linux#! /usr/bin/env python"""\Pindai port serial. Varian khusus Linux yang juga menyertakan USB/Serialadapters.Bagian dari pySerial (http://pyserial.sf.net)(C) 2009 """import serialimport globdef scan():"""memindai port yang tersedia. mengembalikan daftar nama perangkat. pvergain@houx:~/PDEV1V160_CodesRousseau/Soft/PC/test_boost/serialport/pyserial$ python scanlinux.py Port yang ditemukan :/dev/ttyS0 /dev/ttyS3 /dev/ttyS2 /dev/ttyS1 /dev/ttyACM0 /dev/serial/by-id/usb-id3_semiconductors_MEABOARD_00000000-if00 """ mengembalikan glob.glob('/dev/ttyS*' ) + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob('/dev/serial/by-id/*')if __name__==' __main__':print "Found ports:" untuk nama di scan():print name
Suku cadang dan penutup khusus
scrip Python pelacakan wajah OpenCV dan Kode Arduino FaceTrakingCar.rar Skema
Menggunakan arduino untuk mengontrol motor dan servo, pin-out dapat bervariasi.