This commit is contained in:
ty 2025-04-24 18:20:55 +08:00 committed by wuxianfu
parent cef0644af5
commit ccd0c1b26c
11 changed files with 84 additions and 31 deletions

View File

@ -134,6 +134,10 @@ inline float sigmoid(float x)
Mat YOLOPv2::detect(Mat& frame)
{
Mat dstimg;
//this->inpWidth /= 10;
//this->inpHeight/=10;
resize(frame, dstimg, Size(this->inpWidth, this->inpHeight));
this->normalize_(dstimg);
array<int64_t, 4> input_shape_{ 1, 3, this->inpHeight, this->inpWidth };
@ -224,8 +228,10 @@ Mat YOLOPv2::detect(Mat& frame)
const float* pdrive_area = ort_outputs[0].GetTensorMutableData<float>();
const float* plane_line = ort_outputs[1].GetTensorMutableData<float>();
area = this->inpHeight*this->inpWidth;
int min_y = -1;
vector<Point2f> points_L, points_R;
//int min_y = -1;
//vector<Point2f> points_L, points_R;
map<double, double> deviation; //偏移采样点距离 -> 道路中心线相对于小车位置横向偏移距离(右偏为正)(单位mm
double dev_angle; //道路中心线相对小车正前方向偏移角弧度值(右偏为正)(中心线右偏即小车相对中心线左偏)
for (i = 0; i < frame.rows; i++)
{
bool flg = false;
@ -256,7 +262,7 @@ Mat YOLOPv2::detect(Mat& frame)
flg = false;
}
}
if (min_y == -1 && (left != -1 || right != -1)) {
/*if (min_y == -1 && (left != -1 || right != -1)) {
min_y = i;
}
if (left != -1){
@ -264,7 +270,7 @@ Mat YOLOPv2::detect(Mat& frame)
}
if (right != -1){
points_R.push_back(Point2f(right, i));
}
}*/
//若左右参考车道线均存在,计算并标记中心点
if (left > -1 && right > -1) {
int mid = (left + right) / 2;
@ -273,19 +279,35 @@ Mat YOLOPv2::detect(Mat& frame)
outimg.at<Vec3b>(i, mid+k)[1] = 0;
outimg.at<Vec3b>(i, mid+k)[2] = 255;
}
//提取偏移量
for (int k = 0; k < N; k++) {
if (ypos[k] == i) {
deviation[dis[k]] = (mid - center) * rate[k];
}
}
}
//(需要考虑的问题 1.双车道3条线 2.拐角处曲线 3.近处显示不全 4.两条线粘连)
}
//备选方案,对左右车道线分别拟合直线并计算中心线解析式 泛化 鲁棒 目前有bug
if (points_L.size() && points_R.size()) {
/*if (points_L.size() > 1 && points_R.size() > 1) {
Vec4f line_L, line_R;
float kL, bL, kR, bR, kM, bM; // x=ky+b
fitLine(points_L, line_L, DIST_WELSCH, 0, 0.01, 0.01);
fitLine(points_R, line_R, DIST_WELSCH, 0, 0.01, 0.01);
kL = line_L[0] / line_L[1];
bL = line_L[2] - kL * line_L[3];
kR = line_R[0] / line_R[1];
bR = line_R[2] - kR * line_R[3];
Mat pointsMat_L(points_L.size(), 2, CV_32F), pointsMat_R(points_R.size(), 2, CV_32F),
lineRansac_L, lineRansac_R;
for (int i = 0; i < points_L.size(); i++){
pointsMat_L.at<float>(i, 0) = points_L[i].x;
pointsMat_L.at<float>(i, 1) = points_L[i].y;
}
for (int i = 0; i < points_R.size(); i++){
pointsMat_R.at<float>(i, 0) = points_R[i].x;
pointsMat_R.at<float>(i, 1) = points_R[i].y;
}
fitLine(pointsMat_L, lineRansac_L, DIST_L2, 0, 0.01, 0.01);
fitLine(pointsMat_R, lineRansac_R, DIST_L2, 0, 0.01, 0.01);
double kL, bL, kR, bR, kM, bM; // x=ky+b
kL = lineRansac_L.at<float>(0) / (lineRansac_L.at<float>(1) + 1e-12);
bL = lineRansac_L.at<float>(2) - kL * lineRansac_L.at<float>(3);
kR = lineRansac_R.at<float>(0) / (lineRansac_R.at<float>(1) + 1e-12);
bR = lineRansac_R.at<float>(2) - kR * lineRansac_R.at<float>(3);
kM = (kL + kR) / 2;
bM = (bL + bR) / 2;
for (int i = min_y; i < frame.rows; i++) {
@ -294,8 +316,26 @@ Mat YOLOPv2::detect(Mat& frame)
outimg.at<Vec3b>(i, mid+k)[0] = 255;
outimg.at<Vec3b>(i, mid+k)[1] = 0;
outimg.at<Vec3b>(i, mid+k)[2] = 255;
}
}xx
}
for (int k = 0; k < N; k++) {
deviation[dis[k]] = (kM * ypos[k] + bM - center) * rate[k];
}
}*/
//计算偏移角
if (deviation.size() > 1) {
int siz = deviation.size();
double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
for (auto d: deviation) {
sumX += d.first;
sumY += d.second;
sumXY += d.first * d.second;
sumXX += d.first * d.second;
cerr << d.first << ": " << d.second <<endl; //前方xx 距离处:道路中心线相对于小车位置横向偏移距离(右偏为正)(单位mm
}
double slope = (siz * sumXY - sumX * sumY) / (siz * sumXX - sumX * sumX); //道路中心线相对小车正前方向偏移角度正切值(右偏为正)
dev_angle = atan(slope); //道路中心线相对小车正前方向偏移角弧度值(右偏为正)
cerr << slope <<endl << dev_angle <<endl;
}
return outimg;

View File

@ -49,6 +49,12 @@ private:
void nms(vector<BoxInfo>& input_boxes);
const float anchors[3][6] = { {12, 16, 19, 36, 40, 28}, {36, 75, 76, 55, 72, 146},{142, 110, 192, 243, 459, 401} };
const float stride[3] = { 8.0, 16.0, 32.0 };
const static int N = 6; //采样点数量
const float dis[N] = {1000, 2000, 3000, 4000, 5000, 6000}; //偏移量采样点实际距离(mm)
const int ypos[N] = {928, 839, 778, 735, 707, 686}; //偏移量采样点y轴坐标
const int center = 1048; //车体中心x轴坐标
const float rate[N] = {6.37, 8.26, 10.53, 12.98, 15.87, 19.23}; //图像像素到实际偏移(mm)转换率
Env env = Env(ORT_LOGGING_LEVEL_ERROR, "YOLOPv2");
Ort::Session *ort_session = nullptr;

View File

@ -3,7 +3,7 @@
# Generated by qmake (3.1) (Qt 5.15.3)
# Project: ../fast-yolopv2.pro
# Template: app
# Command: /usr/lib/qt5/bin/qmake -o Makefile ../fast-yolopv2.pro -spec linux-g++
# Command: /usr/lib/qt5/bin/qmake -o Makefile ../fast-yolopv2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
#############################################################################
MAKEFILE = Makefile
@ -14,9 +14,9 @@ EQ = =
CC = gcc
CXX = g++
DEFINES = -DOPENCV -DGPU -DCUDNN -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS = -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES)
CXXFLAGS = -pipe -O2 -std=gnu++11 -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES)
DEFINES = -DOPENCV -DGPU -DCUDNN -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS = -pipe -g -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES)
CXXFLAGS = -pipe -g -std=gnu++11 -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES)
INCPATH = -I../../Fast-YolopV2 -I. -I/usr/local/Opencv-4.10.0/include/opencv4 -I/usr/local/cuda-12.6/include -I/usr/local/include/onnxruntime -I/usr/include/aarch64-linux-gnu/qt5 -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -I/usr/include/aarch64-linux-gnu/qt5/QtGui -I/usr/include/aarch64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++
QMAKE = /usr/lib/qt5/bin/qmake
DEL_FILE = rm -f
@ -39,7 +39,7 @@ COMPRESS = gzip -9f
DISTNAME = fast-yolopv21.0.0
DISTDIR = /home/wuxianfu/Projects/Fast-YolopV2/build/.tmp/fast-yolopv21.0.0
LINK = g++
LFLAGS = -Wl,-O1
LFLAGS =
LIBS = $(SUBLIBS) -L/usr/local/Opencv-4.10.0/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -lopencv_videoio -L/usr/local/lib -lonnxruntime /usr/lib/aarch64-linux-gnu/libQt5Widgets.so /usr/lib/aarch64-linux-gnu/libQt5Gui.so /usr/lib/aarch64-linux-gnu/libQt5Core.so -lGL -lpthread
AR = ar cqs
RANLIB =
@ -122,6 +122,7 @@ DIST = /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/spec_pre.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_pre.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resolve_config.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_post.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qml_debug.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/warn_on.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qt.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resources_functions.prf \
@ -214,6 +215,7 @@ Makefile: ../fast-yolopv2.pro /usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++/q
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_pre.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resolve_config.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_post.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qml_debug.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/warn_on.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qt.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resources_functions.prf \
@ -229,7 +231,7 @@ Makefile: ../fast-yolopv2.pro /usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++/q
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/yacc.prf \
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/lex.prf \
../fast-yolopv2.pro
$(QMAKE) -o Makefile ../fast-yolopv2.pro -spec linux-g++
$(QMAKE) -o Makefile ../fast-yolopv2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/spec_pre.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/common/unix.conf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/common/linux.conf:
@ -293,6 +295,7 @@ Makefile: ../fast-yolopv2.pro /usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++/q
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_pre.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resolve_config.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/default_post.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qml_debug.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/warn_on.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/qt.prf:
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/resources_functions.prf:
@ -309,7 +312,7 @@ Makefile: ../fast-yolopv2.pro /usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++/q
/usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/lex.prf:
../fast-yolopv2.pro:
qmake: FORCE
@$(QMAKE) -o Makefile ../fast-yolopv2.pro -spec linux-g++
@$(QMAKE) -o Makefile ../fast-yolopv2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
qmake_all: FORCE
@ -355,7 +358,7 @@ compiler_moc_predefs_make_all: moc_predefs.h
compiler_moc_predefs_clean:
-$(DEL_FILE) moc_predefs.h
moc_predefs.h: /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp
g++ -pipe -O2 -std=gnu++11 -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp
g++ -pipe -g -std=gnu++11 -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp
compiler_moc_header_make_all: moc_mainwindow.cpp
compiler_moc_header_clean:
@ -477,7 +480,6 @@ moc_mainwindow.o: moc_mainwindow.cpp
install_target: first FORCE
@test -d $(INSTALL_ROOT)/opt/fast-yolopv2/bin || mkdir -p $(INSTALL_ROOT)/opt/fast-yolopv2/bin
$(QINSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/opt/fast-yolopv2/bin/$(QMAKE_TARGET)
-$(STRIP) $(INSTALL_ROOT)/opt/fast-yolopv2/bin/$(QMAKE_TARGET)
uninstall_target: FORCE
-$(DEL_FILE) $(INSTALL_ROOT)/opt/fast-yolopv2/bin/$(QMAKE_TARGET)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -59,7 +59,6 @@
#define _STDC_PREDEF_H 1
#define __cpp_nsdmi 200809L
#define __linux 1
#define __OPTIMIZE__ 1
#define __CHAR_UNSIGNED__ 1
#define __UINT32_MAX__ 0xffffffffU
#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L)
@ -77,7 +76,6 @@
#define __WCHAR_MIN__ 0U
#define __INT64_C(c) c ## L
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define _FORTIFY_SOURCE 2
#define __SIZEOF_INT__ 4
#define __INT_FAST64_WIDTH__ 64
#define __PRAGMA_REDEFINE_EXTNAME 1
@ -194,6 +192,7 @@
#define __INTMAX_WIDTH__ 64
#define __LDBL_HAS_INFINITY__ 1
#define __FLT_DIG__ 6
#define __NO_INLINE__ 1
#define __DEC_EVAL_METHOD__ 2
#define __FLT_MANT_DIG__ 24
#define __FLT16_MIN_10_EXP__ (-4)

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 6.0.2, 2025-03-26T17:54:55. -->
<!-- Written by QtCreator 6.0.2, 2025-04-21T05:04:48. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -92,7 +92,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">未命名</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">未命名</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{17edb790-9733-4e4c-9173-37d0ab7cfd4d}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
@ -103,7 +103,7 @@
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">

View File

@ -20,8 +20,9 @@ MainWindow::MainWindow(QWidget *parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
OpenUSBCamera();
//ShowImage();
ShowVideo();
//ShowVideo();
//OpenCSICamera();
}
@ -59,7 +60,7 @@ void MainWindow::ShowVideo()
static const string kWinName = "Deep learning object detection in ONNXRuntime";
namedWindow(kWinName, WINDOW_NORMAL);
cv::VideoCapture cap("/home/wuxianfu/Projects/Fast-YolopV2/build/videos/test1.mp4");
cv::VideoCapture cap("/home/wuxianfu/Projects/Fast-YolopV2/build/videos/566a351c29c00924a337e91e85fa7dec.mp4");
if (!cap.isOpened()) {
std::cerr << "Error opening video stream" << std::endl;
return;
@ -77,7 +78,6 @@ void MainWindow::ShowVideo()
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> spent = end - start;
qDebug()<< " Time: " << spent.count() << " sec \n";
imshow(kWinName, outimg);
if (cv::waitKey(5) >= 0) break; // 按任意键退出循环
}
@ -90,13 +90,14 @@ void MainWindow::OpenUSBCamera() {
Net_config YOLOPv2_nets = { 0.5, 0.5, "/home/wuxianfu/Projects/Fast-YolopV2/build/onnx/yolopv2_192x320.onnx" }; ////choices = onnx文件夹里的文件
YOLOPv2 net(YOLOPv2_nets);
cv::VideoCapture cap(1); // 使用默认的摄像头索引通常是0
cv::VideoCapture cap(0); // 使用默认的摄像头索引通常是0
if (!cap.isOpened()) {
std::cerr << "Error opening video stream" << std::endl;
return;
}
cv::Mat frame;
int cnt=0;
while (true) {
cap >> frame; // 读取一帧
if (frame.empty()) {
@ -104,9 +105,14 @@ void MainWindow::OpenUSBCamera() {
break;
}
cv::resize(frame, frame, Size(frame.cols/2,frame.rows/2));
//cv::imshow("USB Camera", frame);
//cv::imwrite("USB Camera/"+to_string(++cnt)+".jpg", frame);
Mat outimg = net.detect(frame);
cv::imshow("USB Camera", outimg); // 显示帧
cv::imwrite("USB Camera/"+to_string(++cnt)+".jpg", outimg);
if (cv::waitKey(10) >= 0) break; // 按任意键退出循环
}
cap.release(); // 释放资源