Kamera dengan fungsi pelacakan

Saya ingin membuat drone otonom yang dapat dengan sendirinya menemukan jalan menuju tujuan dan kembali, sambil menghindari semua rintangan tanpa mengenai siapa pun. Saya memutuskan untuk memulai dengan jaringan saraf dan webcam. Jadi proyek ini ternyata gambar

Inti dari proyek ini adalah jaringan saraf, atau lebih tepatnya kerangka imageai yang ditulis dengan python di bawah keras, menemukan seseorang dalam gambar dan memberikan koordinat kotaknya. Lebih jauh sepanjang horizontal kita menemukan pusat blok dan memindahkan kamera ke sana (secara alami meninggalkan beberapa histeresis untuk kamera sehingga tidak melompat bolak-balik). Selanjutnya, kami menemukan pusat kedua, tetapi sudah secara vertikal, menambahkan beberapa puluh piksel ke dalamnya, sehingga ketika seseorang berdiri, kamera akan menangkap wajahnya. Saya juga ingin melampirkan pengenalan wajah, tetapi webcam itu murah dan karenanya tidak memiliki fungsi autofokus.

Untuk proyek itu butuh


STM32f4discovery - papan debug
MT415 beberapa driver mesin
2 motor stepper
PSU 24 V 2.5 A
ImageAI

Saya akan menjelaskan secara singkat kode python


Menginisialisasi imageai. Pilih jenis jaringan saraf - yolo dan ukuran gambar - flash. Saat flash, gambar dikurangi menjadi ukuran kecil (saya tidak ingat yang mana) dan karena ini, jaringan dipercepat.

detector = ObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("yolo.h5") detector.loadModel(detection_speed="flash") 

Fungsi untuk mengirim karakter ke mikrokontroler untuk satu langkah di sepanjang sumbu horizontal dan vertikal

 def step(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'v') u=0 ff=ser.read(1) print(1111) if ff==b'B': i=0 def step_y(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'V') u=0 ff=ser.read(1) #print(1111) if ff==b'B': i=0 

Fungsi yang menerima posisi batas kiri dan kanan kotak pada input menemukan bagian tengah dan memutuskan arah mana yang perlu diputar sehingga objek berada di tengah kamera. Sekali lagi, karakter kontrol dikirim ke mikron.

 def rotate_x(left, right): center = (right - left)/2 + left u = 0 if center < 320: i=1 while i: while u!=1: u = ser.write( b'r') u=0 ff=ser.read(1) #print(1111) if ff==b'B': i=0 # print("right") if center > 320: i=1 while i: while u!=1: u = ser.write( b'l') u=0 ff=ser.read(1) print(1111) if ff==b'B': i=0 #print("left") global step_right global step_left if center > 360: step_right = step_right + 1 step_left = step_left - 1 if step_left < 0: step_left = 0 if step_right < 30: step() else: step_right = 30 if (center < 250 and center != 0): step_right = step_right - 1 step_left = step_left + 1 if step_right < 0: step_right = 0 if step_left < 30: step() else: step_left = 30 

Fungsi kontrol vertikal hampir sama. Perbedaannya dijelaskan di atas.

Pada maine, kami sudah menerima dua objek dari jaringan saraf jaringan. Yang pertama adalah gambar dengan posisi objek yang dicat, dan yang kedua adalah array objek yang terdeteksi dengan koordinatnya.

  detected_copy, detections = detector.detectObjectsFromImage(input_image=frame, input_type ="array", output_type = "array") for eachObject in detections: if eachObject["name"] == "person": str1 = eachObject["box_points"] str2= str(str1) n = 1 for i in range(5): if str2[i] in [","]: detect1 = int(str2[1:i]) #print(detect1) print (eachObject["box_points"]) 

Sekarang kode untuk MK


Berfungsi untuk menerima data melalui port virtual com.

 static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ //USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); strncpy(buffer,(char*)Buf,*Len); /* if ((buffer[0] == 0x76)&&(h == 0)) { // h=1; //i=0; CDC_Transmit_FS("B", 1); }*/ if (buffer[0] == 0x76)//v { step = 1; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x73)///s { step = 0; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x6C)//l { dir = 0; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x72)///r { dir = 1; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x56)///V { step1 = 1; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x53)////S { step1 = 0; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x4c)////L { dir1 = 0; CDC_Transmit_FS("B", 1); } if (buffer[0] == 0x52)///R { dir1 = 1; CDC_Transmit_FS("B", 1); } /* picture[i]=buffer[0]; ///CDC_Transmit_FS("Z", 1); i ++; if(i == 9599) { start = 1; }*/ /// CDC_Transmit_FS((unsigned char*)str_rx, strlen(str_rx)); USBD_CDC_ReceivePacket(&hUsbDeviceFS); //CDC_Transmit_FS((unsigned char*)str_rx, strlen(str_rx)); return (USBD_OK); /* USER CODE END 6 */ } 

Mengelola driver langkah. Jika langkah == 1 maka kita mengambil satu impuls dan mendapatkan satu langkah. Arahnya diatur dalam variabel dir

  if(step == 1) { GPIOC->ODR &= ~(1<<0); HAL_Delay(1); GPIOC->ODR |= 1<<0; HAL_Delay(1); i++; if(i == 1) { i = 0; step = 0; /* if(dir == 0) { dir = 1; } else { dir = 0; } ////HAL_Delay(1000);*/ } } if(dir == 1) { GPIOC->ODR |= 1<<1; } else { GPIOC->ODR &= ~(1<<1); } if(step1 == 1) { GPIOC->ODR &= ~(1<<2); HAL_Delay(1); GPIOC->ODR |= 1<<2; HAL_Delay(1); i1++; if(i1 == 1) { i1 = 0; step1 = 0; /* if(dir1 == 0) { dir1 = 1; } else { dir1 = 0; } ////HAL_Delay(1000);*/ } } if(dir1 == 1) { GPIOC->ODR |= 1<<3; } else { GPIOC->ODR &= ~(1<<3); } 

Yah, pada dasarnya itu.


Tautan ke sumber

Terima kasih banyak kepada Artem Lisin untuk bantuan dalam menulis program dengan python!

Source: https://habr.com/ru/post/id483084/


All Articles