效果视频
基于opencv4和yolo,实现PC和单片机通信,控制步进电机捕获目标
PC端代码
//
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/dnn.hpp>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <string>
#include <assert.h>
#include "CSerialPort.h"
int port;
CSerialPort mySerialPort;
#define HEAD_FRAME 0XFD
#define secomd_FRAME 0XDE
unsigned char pData[9] = {
0 };
using namespace cv;
using namespace cv::dnn;
using namespace std;
void PortOpen() {
cout << "Please insert your port number : " << endl;
cin >> port;
if (!mySerialPort.InitPort(port, 115200, 'N', 8, 1, EV_RXCHAR))
{
std::cout << "initPort fail !" << std::endl;
PortOpen();
}
else
{
std::cout << "initPort success !" << std::endl;
}
}
int main(int argc, char** argv)
{
//串口的一些配置
PortOpen();
if (!mySerialPort.OpenListenThread()) {
std::cout << "OpenListenThread fail !" << std::endl;
}
else {
std::cout << "OpenListenThread success !" << std::endl;
}
pData[0] = 'a';
pData[1] = 'b';
string _cfg = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/WZX/wzx.cfg";
string _model = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/WZX/yolo-fastest_7000.weights";
string _labels = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/WZX/wzx.names";
//string _cfg = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/COCO/yolo-fastest.cfg";
//string _model = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/COCO/yolo-fastest.weights";
//string _labels = "H:/VS/Opencv/program/opencv_yolov4_c++/opencv_yolov4_c++/opencv_yolov4_c++/COCO/coco.names";
Net net = readNetFromDarknet(_cfg, _model);
net.setPreferableBackend(DNN_BACKEND_CUDA);
net.setPreferableTarget(DNN_TARGET_CUDA);
vector<string>outputLayerName = net.getUnconnectedOutLayersNames();
for (int i = 0; i < outputLayerName.size(); i++)
{
cout << outputLayerName[i] << endl;
}
ifstream labels_file(_labels); //_labels labels_txt_file
if (!labels_file.is_open())
{
cout << "can't open labels file" << endl;
exit(-1);
}
string label;
vector<string&g

该博客介绍了如何使用OpenCV4和YOLO在PC端实现目标检测,通过串口通信将目标位置信息传递给单片机,进而控制步进电机调整摄像头捕获目标。代码详细展示了视频流处理、YOLO模型应用、物体中心点获取及串口通信过程,并提供了单片机接收数据后的步进电机控制逻辑。
最低0.47元/天 解锁文章





