当前位置:
文档之家› 基于opencv 的图像路径规划处理程序
基于opencv 的图像路径规划处理程序
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)
cvNamedWindow("地图 1",CV_WINDOW_AUTOSIZE); cvShowImage("地图 1",pengzhangtu2);
cvSaveImage("E:/学习/毕业设计/边缘提取/边缘提取/边缘图像.jpg",img1); cvSaveImage("E:/学习/毕业设计/边缘提取/边缘提取/腐蚀图像.jpg",fushitu);
// 不是障碍物
{
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 ) // 如果更优化
// 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 ) {
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) {
{
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 )
{ break;
} }
adjust_heap( i );
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 的窗口对图
++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 );
/*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);
// 交换节点
curr = child;
// 再判断当前孩子节点
child = curr * 2 + 1;
// 再判断左孩子
}
}
if (curr != nIndex) {
return; }
// 往上调整( 只需要比较 cuur child 和 parent ) // while (curr != 0) {
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);
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 ) {
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; } } }
// 判断邻居点是否可以进入 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 != BAБайду номын сангаасRIER )
int curr = nIndex; int child = curr * 2 + 1; // 得到左孩子 idx( 下标从 0 开始,所有做孩子是 curr*2+1 ) // 类似二叉树形式的结构,为何要设计成这种结构?