Java基于OpenCV实现走迷宫(图片+路线展示)

由于疫情,待在家中,太过无聊。同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来。特此记录。

原图:

这张图,由于不是非常清晰,所以我们要进行处理。首先转换为灰度图:

public static Mat RGB2Gray(Mat image) {
// Gray = R*0.299 + G*0.587 + B*0.114
Mat gray = new Mat();
Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);
return gray;
}

主要思路:

  • 转换为灰度图
  • 设置Threshold来区分黑白点,转换为黑白图
  • 规定起点、终点
  • 处理图像,封住边框,这样就不会从外边框走
  • 使用bfs算法来求解走迷宫的最短路径,并通过记录上一个节点嵌套的方式记录下路径
  • 渲染在图片上,输出

代码:

package edu.sfls.Jeff.JavaDev.Maze;

import edu.sfls.Jeff.JavaDev.CVLib.SmartConverter;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs; import java.util.LinkedList;
import java.util.Queue; public class SolveMaze { public static void main(String[] args) throws InterruptedException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src_maze = Imgcodecs.imread("src/IMG_2679.JPG");
HighGui.imshow("src_maze", src_maze);
Mat pre_maze = SmartConverter.RGB2Gray(src_maze);
Mat color_maze = src_maze.clone();
for (int i = 0; i < pre_maze.rows(); i ++)
for (int j = 0; j < pre_maze.cols(); j ++)
if (pre_maze.get(i, j)[0] < 100)
color_maze.put(i, j, 0, 0, 0);
else
color_maze.put(i, j, 255, 255, 255);
for (int i = 0; i < pre_maze.rows(); i ++)
for (int j = 0; j < 32; j ++)
color_maze.put(i, color_maze.cols() - j - 1, 0, 255, 0);
Point startPoint = new Point(color_maze.cols() - 32 - 1 - 2, 347 + 5 - 1);
Point endPoint = new Point(17, 351);
color_maze.put(startPoint.y, startPoint.x, 0, 0, 255); boolean[][] vis = new boolean[1078][702];
for (int i = 0; i < 1078; i ++)
for (int j = 0; j < 702; j ++)
vis[i][j] = false;
vis[startPoint.x][startPoint.y] = true; Point successPoint = new Point(17, 351); Queue<Point> queue = new LinkedList<>();
queue.offer(startPoint);
while (!queue.isEmpty()) {
Point p = queue.poll();
System.out.println(p.x + " " + p.y);
vis[p.x][p.y] = true;
if (p.x == endPoint.x && p.y == endPoint.y) {
System.out.println("success");
successPoint = p;
break;
}
if (p.x - 1 >= 0)
if (!vis[p.x - 1][p.y] && color_maze.get(p.y, p.x - 1)[0] == 255) {
queue.offer(new Point(p.x - 1, p.y, p));
vis[p.x - 1][p.y] = true;
}
if (p.y - 1 >= 0)
if (!vis[p.x][p.y - 1] && color_maze.get(p.y - 1, p.x)[0] == 255) {
queue.offer(new Point(p.x, p.y - 1, p));
vis[p.x][p.y - 1] = true;
}
if (p.x + 1 < 1078)
if (!vis[p.x + 1][p.y] && color_maze.get(p.y, p.x + 1)[0] == 255) {
queue.offer(new Point(p.x + 1, p.y, p));
vis[p.x + 1][p.y] = true;
}
if (p.y + 1 < 702)
if (!vis[p.x][p.y + 1] && color_maze.get(p.y + 1, p.x)[0] == 255) {
queue.offer(new Point(p.x, p.y + 1, p));
vis[p.x][p.y + 1] = true;
}
} System.out.println("out"); Point pre = successPoint.pre;
color_maze.put(pre.y, pre.x, 0, 0, 255);
while (pre.pre != null) {
pre = pre.pre;
color_maze.put(pre.y, pre.x, 0, 0, 255);
} HighGui.imshow("color", color_maze);
HighGui.waitKey(0);
} } class Point { int x, y; Point pre; Point(int x, int y) {
this.x = x;
this.y = y;
} Point(int x, int y, Point pre) {
this.x = x;
this.y = y;
this.pre = pre;
}
}

结果:

Java基于OpenCV实现走迷宫(图片+路线展示)的更多相关文章

  1. 基于OpenCv和swing的图片/视频展示Java实现

    基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...

  2. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  3. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  4. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  5. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

  6. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

  7. Java基于opencv—矫正图像

    更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ...

  8. Java基于opencv—归一化

    Opencv中提供了resize函数,可以把图像调整到相同大小 Java中resize函数的声明,内部调用的都是native方法 public static void resize(Mat src, ...

  9. java基于OpenCV的人脸识别

    基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...

随机推荐

  1. ML基础——搜索引擎与图书管理,百度与李彦宏

    本文始发于个人公众号:TechFlow 谈及机器学习,大家想必会有许多联想,比如最近火热的人工智能,再比如战胜李世石的AlphaGo,甚至还会有人联想起骇客帝国或者是机械公敌等经典机器人电影. 但实际 ...

  2. 开发当中curl简单使用

    curl是linux上可以发送http请求的命令.当然Postman是一个很好的接口调用管理工具,但在验证一个linux服务器调用另外一个linux服务器API是否可用的场景下,非curl命令莫属. ...

  3. C# 字符串与二进制的相互转换

    /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name="s"></para ...

  4. $Loj10157$ 皇宫看守 树形$DP$

    loj Description 有一些宫殿,它们呈树形结构,相邻的宫殿之间可以互相望见.在一些宫殿设立士兵,使得所有的宫殿都有士兵或是被士兵望见.求最小士兵数. Sol 状态: f[x][0] 表示结 ...

  5. 1058 选择题 (20 分)C语言

    批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和多选题的个 ...

  6. JWT实现授权认证

    目录 一. JWT是什么 二. JWT标准规范 三. 核心代码简析 四. 登录授权示例 五. JWT 使用方式 六. JWT注意事项 一. JWT是什么 JSON Web Token(JWT)是目前最 ...

  7. Qt 下QMessageBox下中文乱码问题

    Qt版本 Qt Creator 2.4.1 Based on Qt 4.8.0 (64 bit) 现象 QMessageBox调用setText()一直是乱码 解决方法 QTextCodec::set ...

  8. 记第一个javaweb网页

      <%@ page language="java" contentType="text/html; charset=utf-8" pageEncodin ...

  9. vnpy源码阅读学习(2):学习PyQt5

    PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...

  10. 键盘优雅弹出与ios光标乱飘解决方案

    前言 在移动开发中,会遇到这样的情况,比如说有一个输入框在最底部的时候,我们弹起输入框,输入框不会在输入键盘上. 说明白简单点就是,输入框被键盘挡住了.而且在原生中,输入框应该正好在输入键盘上,但是h ...