algorithm - 追踪图片中的像素

标签 algorithm opencv image-processing

我有一张这样的路的照片

enter image description here

现在我只想查看图片底部左侧的白色车道标记,然后跟随它直到覆盖整个形状。

我不想使用 findContour 函数,因为我会得到很多错误的数据,而且遍历所有可能性来找出正确的数据并不节省时间。

我希望算法速度快,所以只需跟随底部的起点,然后向上并跟随同一张图片中的线。

现在我的问题是是否有任何 openCV 功能可用于跟踪像素或可能是一条小虚线来跟踪该线?

你有什么建议? 提前致谢

最佳答案

如果您知道种子点,则可以通过 floodFill 轻松且快速地完成分段(在我当前的计算机上大约 0.001 秒):

#include <opencv2/opencv.hpp>

#include <boost/chrono/include.hpp>

#include <iostream>
#include <ctime>

std::vector<std::vector<cv::Point>> segment_lane(const cv::Mat& img, const cv::Point& seed, int tol)
{
    cv::Mat mask = cv::Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);
    cv::floodFill(img, mask, seed, 255, 0, cv::Scalar(tol, tol, tol), cv::Scalar(tol, tol, tol), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY + cv::FLOODFILL_FIXED_RANGE);
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(mask, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(-1, -1));
    return contours;
}

int main()
{
    cv::Mat img = cv::imread("Ph2PK.png");

    auto start = boost::chrono::system_clock::now();
    auto contours = segment_lane(img, cv::Point(21, 461), 40);
    auto end = boost::chrono::system_clock::now();

    boost::chrono::duration<double> elapsed_seconds = end - start;
    std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";

    cv::drawContours(img, contours, 0, cv::Scalar(255, 0, 0), 2);
    cv::imshow("img", img);
    cv::imwrite(out.png", img);
    cv::waitKey(0);
}

如果以下轮廓还不够,请尝试调整容差值或省略FLOODFILL_FIXED_RANGE

contour

关于algorithm - 追踪图片中的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18853103/

相关文章:

python - 使用openCV-python将两个轮廓分割成两个相同大小的不同图像

php - 如何在使用PHP删除图像后显示图像

algorithm - 从大列表中识别最新版本文件的更好逻辑是什么

algorithm - 按元素出现删除子列表(方案)

c++ - 有效地获取给定数字的所有除数

c++ - 如何找出在 C++ 中用于 OpenCV .at 函数的类型?

c++ - 将白色像素区域合并为一个区域 opencv c++

algorithm - 如何根据坐标对角填充二维数组

python - 如何从 node-red 打开 CV2.frame 窗口? - 执行脚本到 UI 应用程序

python - 如何使用opencv找到图像中所有圆圈的所有接触点