使用迪杰斯特拉算法
对下面的图片进行路径规划
OpenCV的边缘检测将物体边缘标记
//灰度化,滤波,Canny边缘检测
cvtColor(srcImage, maskWaterShed, COLOR_RGB2GRAY );//灰度转换
GaussianBlur(maskWaterShed, maskWaterShed, Size(5, 5), 2); //高斯滤波
//imshow("Gray Image", maskWaterShed);
Canny(maskWaterShed, maskWaterShed, 80, 150);
通过对面积大小进行分类
通过改变不同面积大小,寻找到合适的范围,可视化发现,为避免遗漏,可在原图上进行标记
Mat showBinarySearch=srcImage;//Mat(maskImage.size(), CV_8UC3);
默认构函,只是浅拷贝,共享一份内存空间,即在新图像做出改变会导致原图改变。
应用opencv拷贝函数。
Mat showBinarySearch=srcImage.clone();//Mat(maskImage.size(), CV_8UC3);
可以看到,在面积设置为800时,所有的物体轮廓基本覆盖完毕
当然,由于图片分辨率的问题,个别行人的轮廓没有得到检测,也便未能显示,这在实际应用中必是万万不可的,但考虑到这只是一种方案的理论实践,暂且忽略这个问题。
再通过随机点分出的不同区域进行判定
找到可行的最短路径
通过边缘检测后
应用现有规划路径功能,只需将具有物体区域设置为不可行区域,并将路径以质心间画线做为显示
修改成功
下面只需通过交互方式标定起始点和终止点,并将识别为人和车的区域规避即可。
窗体坐标为标题右上角
通过计算找到图像对应坐标的表达式
实现在鼠标点击处标记,绘制起点图样
交互设置起点和终点
牛刀小试
这次会成功吗?
发现位置并不对
int ProcessPicture::findArea(int j, int i)
{
int index = maskImage.at<int>(i, j);
while(index <= 0 || index2Serial[index] <= 0)
{
index = maskImage.at<int>(i, --j);
}
return index2Serial[index];
}
原因在这里!!!我又忘记一个关键问题,OpenCV中的像素点矩阵坐标并非按照行优先,而是列优先,因此永远会出问题,如果不是想到当时绘制地铁线路图时同样出现过这个问题,恐怕又要想破脑袋!谨记
老老实实调试
好像没有什么问题
另一张图也没有问题
点数增加也没有问题
那便是对应正确
有闪避出现
实现躲避车辆