模型每类阈值+配置热重载+雷达纯距离触发+速度min不叠加+弯道参数化
This commit is contained in:
+9
-27
@@ -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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user