2

このような道路の写真があります

ここに画像の説明を入力

ここで、写真の下部だけを見て、左側の白いレーン マークを上に向けて、形状全体をカバーするまでそれをたどりたいと思います。

私は findContour 関数を使用したくありません。なぜなら、多くの悪いデータを取得するためであり、すべての可能性を調べて正しいものを見つけるのは時間効率が悪いからです。

アルゴリズムを高速にしたいので、下の開始点をたどり、上に行って同じ図の線をたどります。

今私の質問は、ピクセルを追跡するために利用できるopenCV機能、または線をたどるための小さな破線がありますか?

何を指示してるんですか?前もって感謝します

4

1 に答える 1

2

シード ポイントがわかっている場合、セグメンテーションは次の方法で簡単かつ非常に高速に実行できます (現在のマシンでは約 0.001 秒) floodFill

#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

輪郭

于 2013-09-20T12:48:54.253 に答える