基于opencv 的图像路径规划处理程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

int s_h; // 启发函数预测的此点到终点的距离
int s_style;// 结点类型:起始点,终点,障碍物
struct AStarNode * s_parent; // 父节点
int s_is_in_closetable; // 是否在 close 表中
int s_is_in_opentable;
// 不是障碍物
{
if ( !map_maze[x][y].s_is_in_closetable ) // 不在闭表中
{
if ( map_maze[x][y].s_is_in_opentable ) // 在 open 表中
{
// 需要判断是否是一条更优化的路径
//
if ( map_maze[x][y].s_g > curr_node->s_g + w ) // 如果更优化
/*cvNamedWindow("image0", CV_WINDOW_AUTOSIZE ); cvNamedWindow( "图像 Canny 边缘检测结果",CV_WINDOW_AUTOSIZE ); cvNamedWindow("图形平滑滤波结果",CV_WINDOW_AUTOSIZE); cvNamedWindow("第一次膨胀结果",CV_WINDOW_AUTOSIZE); cvNamedWindow("腐蚀结果",CV_WINDOW_AUTOSIZE); cvShowImage("图形平滑滤波结果",gaussianImg); cvShowImage( "image0", img0 ); cvShowImage( "图像 Canny 边缘检测结果", img1 ); cvShowImage( "第一次膨胀结果", pengzhangtu ); cvShowImage("第一次膨胀腐蚀结果",fushitu);
++child;// 判断左右孩子大小 }
if (open_table[curr]->s_g + open_table[curr]->s_h <= open_table[child]->s_g +
open_table[child]->s_h)
{
break;
}
else
{
swap( child, curr );
基于 opencv 的图像路径规划处理程序(C 语言) #include <stdio.h> #include <stdlib.h> #include <cv.h> #include <highgui.h> #include <cxcore.h> #include <stdio.h> #define STARTNODE 3 #define ENDNODE 2 #define BARRIER -1
{ break;
} }
adjust_heap( i );
int curr = nIndex; int child = curr * 2 + 1; // 得到左孩子 idx( 下标从 0 开始,所有做孩子是 curr*2+1 ) // 类似二叉树形式的结构,为何要设计成这种结构?
int parent = ( curr - 1 ) / 2; // 得到双亲 idx
IplImage * picture_processing(IplImage* src,int flag) {
CvSize size; IplImage* img0 = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); img0=src; IplImage* img1 = NULL; //img0 = cvLoadImage( "7.jpg", 0 );//0 强制转会为灰度图 if (img0->height > img0->width) {
size.width=480; size.height=640; } else { size.width=640; size.height=480; } img1 = cvCreateImage(size,IPL_DEPTH_8U,1); IplImage * avgImg = cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * medianImg = cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * gaussianImg = cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * pengzhangtu= cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * fushitu= cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * pengzhangtu2= cvCreateImage(size, IPL_DEPTH_8U, img0->nChannels); IplImage * suofanghoutuxiang = cvCreateImage(size,IPL_DEPTH_8U, img0->nChannels);
int mask[9] = {0, 1, 0, 1, 1, 1, 0, 1, 0}; IplConvKernel* strel = cvCreateStructuringElementEx( 3, 3, 1, 1, CV_SHAPE_CUSTOM, mask );//定 义膨胀腐蚀的结构模板
cvResize( img0, suofanghoutuxiang, CV_INTER_AREA ); cvSmooth(suofanghoutuxiang, avgImg, CV_BLUR, 7,img0->nChannels); //采用 7x7 的窗口对图
// 判断邻居点是否可以进入 open 表 // void insert_to_opentable( int x, int y, pAStarNode curr_node, pAStarNode end_node, int w ) {
int i;
if ( map_maze[x][y].s_style != BARRIER )
if (open_table[curr]->s_g + open_table[curr]->s_h >= open_table[parent]->s_g + open_table[parent]->s_h)
{ break;
} else {
swap( curr, parent ); curr = parent; parent = (curr-1)/2; } } }
cvNamedWindow("地图 1",CV_WINDOW_AUTOSIZE); cvShowImage("地图 1",pengzhangtu2);
cvSaveImage("E:/学习/毕业设计/边缘提取/边缘提取/边缘图像.jpg",img1); cvSaveImage("E:/学习/毕业设计/边缘提取/边缘提取/腐蚀图像.jpg",fushitu);
{
map_maze[x][y].s_g = curr_node->s_g + w;
map_maze[x][y].s_parent = curr_node;
for ( i = 0; i < open_node_count; ++i ) {
if ( open_table[i]->s_x == map_maze[x][y].s_x && open_table[i]->s_y == map_maze[x][y].s_y )
// 是否在 open 表中
}AStarNode, *pAStarNode;
AStarNode map_maze[640][640]={255};
// 结点数组
pAStarNode open_table[640*480]={0}; // open 表
pAStarNode close_table[640*480]={0};
像进行均值滤波 cvSmooth(suofanghoutuxiang, medianImg, CV_MEDIAN, 7, img0->nChannels); //采用 7x7 的窗 口对图像进行中值滤波 cvSmooth(suofanghoutuxiang, gaussianImg, CV_GAUSSIAN, 7, img0->nChannels); // Gauss 平 滑滤波,核大小为 7x7 //高斯的核不同于上面两个,它实现了领域像素的加权平均,离中心 越近的像素权重越高
// close 表
int open_node_count; // open 表中节点数量
int close_node_count; // close 表中结点数量
pAStarNode path_stack[640*480]; // 保存路径的栈
int top = -1;
// 栈顶
// 交换两个元素 // void swap( int idx1, int idx2 ) {
return(pengzhangtu2); else
return(img1); }
typedef struct AStarNode
{
wk.baidu.com
int s_x; // 坐标(最终输出路径需要)
int s_y;
int s_g; // 起点到此点的距离( 由 g 和 h 可以得到 f,此处 f 省略,f=g+h )
pAStarNode tmp = open_table[idx1]; open_table[idx1] = open_table[idx2]; open_table[idx2] = tmp; }
// 堆调整 // 使用堆排序 会将最小 f 值得点直接选出来 void adjust_heap( int /*i*/nIndex ) {
if (nIndex < 0 || nIndex >= open_node_count) {
return; }
// 往下调整( 要比较左右孩子和 cuur parent ) // while ( child < open_node_count ) {
// 小根堆是双亲值小于孩子值 // if ( child + 1 < open_node_count && open_table[child]->s_g + open_table[child]->s_h > open_table[child+1]->s_g + open_table[child+1]->s_h ) {
cvNamedWindow("地图",CV_WINDOW_AUTOSIZE);
cvShowImage("地图",suofanghoutuxiang);
cvWaitKey(0);
cvReleaseImage( &img0 ); cvReleaseImage( &img1 );
cvReleaseImage( &gaussianImg ); cvReleaseImage(&pengzhangtu); cvReleaseImage(&fushitu); cvReleaseImage(&pengzhangtu2); cvReleaseImage(&suofanghoutuxiang);*/ if(flag==1)
// 交换节点
curr = child;
// 再判断当前孩子节点
child = curr * 2 + 1;
// 再判断左孩子
}
}
if (curr != nIndex) {
return; }
// 往上调整( 只需要比较 cuur child 和 parent ) // while (curr != 0) {
cvCanny(gaussianImg, img1,30, 90, 3); cvDilate( img1, pengzhangtu, NULL, 3); cvErode( pengzhangtu, fushitu, NULL, 3 ); cvDilate(fushitu,pengzhangtu2,strel,5);
相关文档
最新文档