整体设计如下:
[img]blob:
https://mbb.eet-china.com/5ab565ae-c09a-4dbd-9414-d6c286e86a83[/img]
控制部分使用arduino+ 富芮坤蓝牙开发板方案,arduino部分代码
int speed_A=0;
int speed_B=0;
int PMW_A=6;
int DIGIT_A_HIGH=7;
int DIGIT_A_LOW=8;
int PMW_B=11;
int DIGIT_B_HIGH=9;
int DIGIT_B_LOW=10;
void straight(int time,int speed){
analogWrite(PMW_A,speed);
analogWrite(PMW_B,speed);
digitalWrite(DIGIT_A_HIGH,HIGH);
digitalWrite(DIGIT_A_LOW,LOW);
digitalWrite(DIGIT_B_HIGH,HIGH);
digitalWrite(DIGIT_B_LOW,LOW);
delay(time);
}
void back(int time,int speed){
digitalWrite(DIGIT_A_HIGH,LOW);
digitalWrite(DIGIT_A_LOW,HIGH);
digitalWrite(DIGIT_B_HIGH,LOW);
digitalWrite(DIGIT_B_LOW,HIGH);
analogWrite(PMW_A,speed);
analogWrite(PMW_B,speed);
delay(time);
}
void turn_left(int time,int speed){
analogWrite(PMW_A,speed);
analogWrite(PMW_B,speed);
digitalWrite(DIGIT_A_HIGH,LOW);
digitalWrite(DIGIT_A_LOW,LOW);
digitalWrite(DIGIT_B_HIGH,HIGH);
digitalWrite(DIGIT_B_LOW,LOW);
delay(time);
}
void turn_right(int time,int speed){
analogWrite(PMW_A,speed);
analogWrite(PMW_B,speed);
digitalWrite(DIGIT_A_HIGH,HIGH);
digitalWrite(DIGIT_A_LOW,LOW);
digitalWrite(DIGIT_B_HIGH,HIGH);
digitalWrite(DIGIT_B_LOW,HIGH);
delay(time);
}
void stop_run(int time,int speed){
analogWrite(PMW_A,speed);
analogWrite(PMW_B,speed);
digitalWrite(DIGIT_A_HIGH,LOW);
digitalWrite(DIGIT_A_LOW,LOW);
digitalWrite(DIGIT_B_HIGH,LOW);
digitalWrite(DIGIT_B_LOW,LOW);
delay(time);
}
void setup() {
pinMode(PMW_A,OUTPUT);
pinMode(PMW_B,OUTPUT);
pinMode(DIGIT_A_HIGH,OUTPUT);
pinMode(DIGIT_A_LOW,OUTPUT);
pinMode(DIGIT_B_HIGH,OUTPUT);
pinMode(DIGIT_B_LOW,OUTPUT);
Serial.begin(9600);
}
void loop() {
int c;
while(Serial.available()>0){
c=Serial.parseInt();
Serial.println("hello");
if(c==1){
straight(5000,255);
}
else if(c==6){
back(5000,255);
}
else if(c==3){
turn_left(5000,255);
}
else if(c==4){
turn_right(5000,255);
}
else if(c==5){
stop_run(5000,255);
}
}
}
图传部分采用EasyDarwin,搭建一套流媒体服务,并在电脑端获取视频信息
[img]blob:
https://mbb.eet-china.com/bc78b6c4-9525-4d67-b1a1-dd61b69ea722[/img]
图像识别,通过screencapture命令抓取每一帧图像,通过PC下位机的守护进程对每一帧图像调用OPENCV的方法进行图像识别
#include "opencv2/opencv.hpp"
#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<iostream>
#include<stdio.h>
#include<unistd.h>
using namespace cv;
using namespace std;
int main(int argc, char **argv){
namedWindow("MyWindow", CV_WINDOW_NORMAL);
while(1){
int ret;
ret=system("screencapture -T 0 -R 50,50,430,650 /Users/test/Downloads/1.png");
// printf("%d",ret);
// usleep(2000);
double scale=0.5;
Mat img = imread("/Users/test/Downloads/1.png");
Size dsize = Size(img.cols*scale,img.rows*scale);
Mat image2 = Mat(dsize,CV_32S);
resize(img, image2,dsize);
HOGDescriptor defaultHog;
defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
vector<Rect> found;
//进行检测
defaultHog.detectMultiScale(image2, found);
for(int i = 0; i < found.size(); i++){
Rect r = found;
rectangle(image2, r.tl(), r.br(), Scalar(0, 0, 255), 3);
}
Mat grayImage,edge;
cvtColor(image2, grayImage, COLOR_BGR2GRAY);
blur(grayImage, edge, Size(3,3));
Canny(edge, edge, 120, 120);
imshow("MyWindow",edge);
if (waitKey(30) >= 0) break;
}
}