树莓派opencv python 实例教程三 黑线路径跟随机器人

该机器人具有一项新功能,可以沿着地板上的黑线绘制。

我创建了一个带有行的新符号,当机器人读取该符号时,它将开始以下过程。

怎么运行的

实际上,行跟随功能是以非常简单的方式实现的。因为该线是黑色的,所以很容易与地面隔离,因此可以使用简单的二值化来执行。这是已实现功能的步骤。

1.获取roi 

首先要做的是选择一个ROI(关注区域),如下图所示。

lineA.jpg


在这种情况下,图像的中间区域将如下所示:

lineR.jpg


更改ROI图像(上下)将改变机器人在角落的行为。如果选择了顶部区域,则机器人将更快转动,否则它将稍后转动。这需要进行一些调整,这将取决于机器人的速度和摄像机的倾斜角度。



代码如下:



Rect roi(0,190,640,100);

greyImg(roi).copyTo(roiImg);


2.阈值设置

下一步要做的是对ROI图像进行阈值设置,必须调整阈值级别,想法是要获得以下内容:

下图是反相后得到黑白颠倒,中间的黑色变成白色的框,算出中心point。



lineR (1).jpg
我正在使用形态学操作来减少噪音。代码如下:


threshold(roiImg, roiImg, thVal , 255, 0);
bitwise_not(roiImg, roiImg); // negative image
Mat erodeElmt = getStructuringElement(MORPH_RECT, Size(3, 3));
Mat dilateElmt = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(roiImg, roiImg, erodeElmt);
dilate(roiImg, roiImg, dilateElmt);



int th = 100;
cv::Mat threshold1, threshold2, threshold3, threshold4, threshold5, threshold6, threshold7, threshold8;
cv::threshold(gray, threshold1, th, 255, cv::THRESH_BINARY);
cv::threshold(gray, threshold2, th, 255, cv::THRESH_BINARY_INV);
cv::threshold(gray, threshold3, th, 255, cv::THRESH_TRUNC);
cv::threshold(gray, threshold4, th, 255, cv::THRESH_TOZERO);
cv::threshold(gray, threshold5, th, 255, cv::THRESH_TOZERO_INV);
cv::threshold(gray, threshold7, th, 255, cv::THRESH_OTSU);


3.查找轮廓和中心

下一步是找到图像轮廓,在这种情况下,它将只有一个轮廓(白色四边形)。找到图像轮廓后,很容易找到其中心,该中心将用于转动机器人。如果轮廓中心移到一侧,则机器人必须转动以跟随它。

查找中心的代码:

findContours(roiImg, contours, hierarchy, CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE, Point(0,0));
for (size_t i = 0; i < contours.size(); i++) {
   float area = contourArea(contours[i]);
   if (area > 2000) {
      Moments mu;
      mu = moments(contours[i], false);
      Point2f center(mu.m10 / mu.m00, 240); // point in center (x only)
      circle(camera, center, 5, Scalar(0, 255, 0), -1, 8, 0);   
   }
}

最新评论

  1. cccc
    发布于:2021-01-15 10:44 回复
    庆祝站长可以看到视频了

sitemap