树莓派opencv python 实例教程三 黑线路径跟随机器人
该机器人具有一项新功能,可以沿着地板上的黑线绘制。
我创建了一个带有行的新符号,当机器人读取该符号时,它将开始以下过程。
怎么运行的
1.获取roi
首先要做的是选择一个ROI(关注区域),如下图所示。
更改ROI图像(上下)将改变机器人在角落的行为。如果选择了顶部区域,则机器人将更快转动,否则它将稍后转动。这需要进行一些调整,这将取决于机器人的速度和摄像机的倾斜角度。
代码如下:
Rect roi(0,190,640,100);
greyImg(roi).copyTo(roiImg);
2.阈值设置
下一步要做的是对ROI图像进行阈值设置,必须调整阈值级别,想法是要获得以下内容:
下图是反相后得到黑白颠倒,中间的黑色变成白色的框,算出中心point。
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); } }
最新评论