模型每类阈值+配置热重载+雷达纯距离触发+速度min不叠加+弯道参数化

This commit is contained in:
spdis
2026-06-21 14:15:53 +08:00
parent 95a46c130d
commit 40d5cb1604
11 changed files with 234 additions and 147 deletions
+9 -27
View File
@@ -58,29 +58,19 @@ int line_tracking_height; // 处理高度 = 60
// ============================================================
cv::Mat image_binerize(cv::Mat &frame)
{
cv::Mat output;
cv::Mat binarizedFrame;
cv::Mat hsvImage;
static cv::Mat output;
static cv::Mat binarizedFrame;
static cv::Mat hsvImage;
static std::vector<cv::Mat> hsvChannels(3);
// 1. BGR → HSV:分离色调(H)、饱和度(S)、明度(V) 三个通道
cv::cvtColor(frame, hsvImage, cv::COLOR_BGR2HSV);
std::vector<cv::Mat> hsvChannels;
cv::split(hsvImage, hsvChannels);
// hsvChannels[0] = H (色调, 0~180)
// hsvChannels[1] = S (饱和度, 0~255)
// hsvChannels[2] = V (明度, 0~255)
// 2. H 通道 Otsu 二值化:区分蓝色与非蓝色
cv::threshold(hsvChannels[0], binarizedFrame,
0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
// 3. S 通道 Otsu 二值化:区分高饱和(蓝色赛道)与低饱和(灰色路面)
cv::threshold(hsvChannels[1], output,
0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
// 4. 双通道融合:任一通道认为"非赛道"就排除
// bitwise_or: 两幅图同为赛道(255)才保留,否则变为背景(0)
cv::bitwise_or(output, binarizedFrame, output);
return output;
@@ -111,15 +101,11 @@ cv::Mat image_binerize(cv::Mat &frame)
// ============================================================
cv::Mat find_road(cv::Mat &frame)
{
// 1. 形态学开运算去噪
// MORPH_CROSS: 十字形结构元素,2×2
// MORPH_OPEN: 先腐蚀(去除小白点) 再膨胀(恢复区域尺寸)
static cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(2, 2));
cv::morphologyEx(binarizedFrame, morphologyExFrame, cv::MORPH_OPEN, kernel);
// 2. 创建洪泛填充蒙版
// 尺寸比原图各边大 2 像素 (floodFill 要求)
cv::Mat mask = cv::Mat::zeros(line_tracking_height + 2, line_tracking_width + 2, CV_8UC1);
static cv::Mat mask;
mask = cv::Mat::zeros(line_tracking_height + 2, line_tracking_width + 2, CV_8UC1);
// 3. 种子点位置
// X = 图像水平中心 (line_tracking_width/2)
@@ -143,10 +129,8 @@ cv::Mat find_road(cv::Mat &frame)
cv::floodFill(morphologyExFrame, mask, seedPoint, newVal,
nullptr, loDiff, upDiff, 8);
// 7. 从蒙版提取赛道区域
// mask 的外扩边框(±1) 用于 floodFill 的内部计算,实际区域在(1,1)起
// ROI 裁掉边框后即为赛道主体蒙版
cv::Mat outputImage = cv::Mat::zeros(line_tracking_height, line_tracking_width, CV_8UC1);
static cv::Mat outputImage;
outputImage = cv::Mat::zeros(line_tracking_height, line_tracking_width, CV_8UC1);
mask(cv::Rect(1, 1, line_tracking_width, line_tracking_height)).copyTo(outputImage);
return outputImage;
@@ -167,10 +151,8 @@ cv::Mat find_road(cv::Mat &frame)
// ============================================================
void image_main()
{
cv::Mat resizedFrame;
static cv::Mat resizedFrame;
// ── 1. 降采样 ──────────────────────────────────────
// 320×240 → 80×60,大幅缩减计算量
cv::resize(raw_frame, resizedFrame,
cv::Size(line_tracking_width, line_tracking_height));