[opencv]路径规划--图像识别目标分离

created by Dejavu
[完结]


目的

  • 这里我们试图将路径规划的起点物体,终点靶目标,障碍物抽象成基本图形,分别为圆形和方形,这样为我们测试路径规划算法提供原始可视的目标数据
  • 如下图所示,这里我们设定红色为起点物体,绿色为终点靶目标,灰色为障碍物


c++ opencv 目标分离

  • 用到的头文件 a_star.h,这里外部调用时函数只需调用Obj all_obj(Mat src,Mat &take_look)这个即可

      #include "a_star.h"
      Pt center_pt(Mat src) {
          Pt pt;
          int r;
          bool find(false);
          for (int i = 0;i < src.cols;i++) {
              for (int j = 0;j < src.rows;j++) {
                  if (src.at<uchar>(j, i) >= 200) {
                      pt.pt.y = j;
                      r = i;
                      find = true;
                      break;
                  }
              }
              if (find) break;
          }
          find = false;
          for (int i = 0;i < src.rows;i++) {
              for (int j = 0;j < src.cols;j++) {
                  if (src.at<uchar>(i, j) >= 200) {
                      pt.pt.x = j;
                      r = j - r;
                      find = true;
                      break;
                  }
              }
              if (find) break;
          }
          pt.r = r;
          return pt;
      }
    
      bool foundFromGrid(Point index, Point tar, int r, Point &pt) {
          Point tmp = Point(index.x*r, index.y*r);
          if (tmp.x <= tar.x && tmp.y <= tar.y && tmp.x + r >= tar.x && tmp.y + r >= tar.y) {
              pt = index;
              return true;
          }
          return false;
      }
    
      GridMapInfo map2grid_map(Mat map, int _r, Point tar, Point dest,Mat &take_look) {
          GridMapInfo info;
          bool isFoundT(false), isFoundD(false);
          Mat grid_map(map);
          int r = _r * 2;
          int n = map.rows / r;
          int m = map.cols / r;
          for (int y = 0;y < n;y++) {
              for (int x = 0;x < m;x++) {
                  bool isBlock(false);
                  for (int i = 0;i < r;i++) {
                      for (int j = 0;j < r;j++) {
                          if (grid_map.at<uchar>(y*r + i, x*r + j) < 100) {
                              isBlock = true;
                              break;
                          }
                      }
                  }
                  info.map[x][y].init();
                  info.map[x][y].isWall = isBlock;
                  info.map[x][y].index = Point(x, y);
                  info.map[x][y].pt = Point(x*r, y*r);
                  info.map[x][y].center = Point(x*r + r / 2, y*r + r / 2);
                  info.map[x][y].addNeighbors();
                  if (isBlock) {
                      for (int i = 0;i < r;i++) {
                          for (int j = 0;j < r;j++) {
                              if (grid_map.at<uchar>(y*r + i, x*r + j) < 100) continue;
                              else grid_map.at<uchar>(y*r + i, x*r + j) = 0;
                          }
                      }
                  }
                  if (!isFoundT) isFoundT = foundFromGrid(Point(x, y), tar, r, info.target);
                  if (!isFoundD) isFoundD = foundFromGrid(Point(x, y), dest, r, info.dest);
                  rectangle(grid_map, Rect(x*r, y*r, r, r), Scalar::all(150), 5);
                  rectangle(take_look, Rect(x*r, y*r, r, r), Scalar::all(150), 5);
              }
          }
          info.obj_img = grid_map;
          if(DUBUG) imshow("obj", grid_map);
          return info;
    
      }
    
      Obj all_obj(Mat src,Mat &take_look) {
          Obj obj;
          vector<Mat> ch(3);
          Mat element = getStructuringElement(MORPH_RECT, Size(4, 4));
          split(src, ch);
          Mat b, g, r;
    
          b = ch.at(0);
          g = ch.at(1);
          r = ch.at(2);
    
          Mat block_img;
          Mat obj_src;
          addWeighted(b, 0.5, g, 0.5, 0, block_img);
          addWeighted(r, 0.5, block_img, 0.5, 0, block_img);
          Mat bg;
          threshold(block_img, bg, 250, 255, 1);
          threshold(block_img, block_img, 150, 255, 0);
          addWeighted(block_img, 0.5, bg, 0.5, 0, block_img);
          threshold(block_img, block_img, 250, 255, 1);
          blur(block_img, block_img, Size(7, 7));
          threshold(block_img, block_img, 50, 255, 0);
          obj_src = block_img.clone();
          erode(block_img, block_img, element);
          if(DUBUG) imshow("block", block_img);
    
          threshold(b, b, 10, 255, 1);
          threshold(g, g, 10, 255, 1);
          threshold(r, r, 10, 255, 1);
    
          Mat target_img, dest_img;
          addWeighted(b, 0.5, g, 0.5, 0, target_img);
          threshold(target_img, target_img, 200, 255, 0);
          addWeighted(r, 0.5, b, 0.5, 0, dest_img);
          threshold(dest_img, dest_img, 200, 255, 0);
          if(DUBUG) {
              imshow("target", target_img);
              imshow("dest", dest_img);
          }
          if(DUBUG) imshow("obj_src", obj_src);
    
          obj.obj_src = obj_src;
          obj.target = center_pt(target_img);
          obj.dest = center_pt(dest_img);
          obj.info = map2grid_map(block_img, obj.target.r, obj.target.pt, obj.dest.pt,take_look);
          return obj;
      }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273

推荐阅读更多精彩内容