具有跟踪功能的相机

我想制造一种自动无人机,它可以自己找到通往目标和返回的道路,同时避免所有障碍而不会撞到任何人。 我决定从神经网络和网络摄像头开始。 所以这个项目结果 图片

该项目的实质是神经网络,或者说是在keras下用python编写的imageai框架,在图片中找到一个人并给出他的盒子的坐标。 沿着水平线进一步找到块的中心,然后将相机移动到那里(自然会为相机留一些滞后,以免它来回跳动)。 接下来,我们找到第二个中心,但已经垂直了,向其添加了几十个像素,以便当一个人站立时,相机将捕获其面部。 我也想附加人脸识别,但是网络摄像头很便宜,因此没有自动对焦功能。

对于该项目,它花了


STM32f4发现-调试板
MT415几个引擎驱动程序
2个步进电机
电源24 V 2.5 A
图像AI

我将简要描述python代码


初始化图像。 选择神经网络的类型-yolo和图片的大小-闪烁。 使用闪光灯时,图片会缩小为较小尺寸(我不记得是哪一张),因此,网络会加速。

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

沿水平和垂直轴将字符发送到微控制器一步的功能

 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 

在输入处接收框的左右边框位置的功能会找到中心,并确定必须以哪种方式旋转以使对象位于相机的中间。 同样,控制字符被发送到微米。

 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 

垂直控制功能几乎相同。 差异如上所述。

在缅因州,我们已经从网络的神经网络接收到两个对象。 第一个是带有对象绘制位置的图片,第二个是检测到的对象及其坐标的数组。

  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"]) 

现在是MK的代码


通过虚拟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 */ } 

管理步进驱动器。 如果step == 1,那么我们采取一冲而获得一步。 方向在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); } 

好吧,基本上就是这样。


链接到源

非常感谢Artem Lisin在使用python编写程序方面的帮助!

Source: https://habr.com/ru/post/zh-CN483084/


All Articles