整体设计如下:
[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;


    }

  }