我有一张像这样的道路的照片
现在我想只看左边白色车道标记的图片底部并跟着它直到我覆盖整个形状。
我不想使用findContour函数,因为我会得到很多不好的数据,并且没有时间来完成所有可能性来找到合适的数据。
我希望算法快速,所以只需按下底部的起点,然后沿着同一张图片中的直线前进。
现在我的问题是,是否有任何openCV功能可用于跟踪像素,或者可能是一条点线以跟随线路?
你有什么建议? 提前致谢
答案 0 :(得分:2)
如果您知道种子点,则可以通过floodFill
轻松快速地完成分割(在我当前的机器上大约0.001s):
#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
。