Java基于OpenCV实现走迷宫(图片+路线展示)
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实现走迷宫(图片+路线展示)的更多相关文章
- 基于OpenCv和swing的图片/视频展示Java实现
		基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ... 
- Java基于opencv实现图像数字识别(五)—投影法分割字符
		Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ... 
- Java基于opencv实现图像数字识别(四)—图像降噪
		Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ... 
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
		Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ... 
- Java基于opencv实现图像数字识别(二)—基本流程
		Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ... 
- Java基于opencv实现图像数字识别(一)
		Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ... 
- Java基于opencv—矫正图像
		更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ... 
- Java基于opencv—归一化
		Opencv中提供了resize函数,可以把图像调整到相同大小 Java中resize函数的声明,内部调用的都是native方法 public static void resize(Mat src, ... 
- java基于OpenCV的人脸识别
		基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ... 
随机推荐
- while Ture怎么退出全部
			while True: #这是一个死循环 如果想要quit出去只能一层一层的退出 比如如果在第三层输入quit会回到第二层 那么有什么方法能够在第三层就退出全部? print("level1 ... 
- Linux中编写shell脚本的小例子
			1.创建一个test.sh的文件 touch test.sh 2.编辑这个文件 vi test.sh 3.进入到编辑页面后将编辑页面先切换成编辑模式(按Esc键就可以切换) 4.切换到编辑模式后开始向 ... 
- 最小生成树+LCA不能算最小环!!!!!!!
- 【他山之石】jenkins忘记初始化密码解决办法
			没有太好的方式,网上有的是这样子的,找到 /var/lib/jenkins/users/username/config.xml, 修改为一个已知的 hash 值 #jbcrypt:$2a$10$Dda ... 
- Windows和Linux下与VMware虚拟机通过内网IP通讯
			首先分两种情况:一种是你的电脑已经在一个内网的环境下且有额外的内网IP地址,和另一种只是想给自己电脑上的虚拟机分配个内网IP来通讯. ①有可用的内网IP 找到一个空闲的IP地址(这里以192.168. ... 
- Django 博客实现简单的全文搜索
			作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Django Mode ... 
- 关于javaweb开发的环境搭建(一)Tomcat
			进行Tomcat的下载及环境配置 1.下载地址 http://tomcat.apache.org/ 2.下载的注意事项 下载的Tomcat版本要与自身电脑安装的java版本相匹配,下载时,点击 ... 
- Linux查看端口监听占用
			# 查看所有 netstat -ntlp # 过滤PORT8080 netstat -ntlp | grep 8080 -t # 仅显示tcp相关选项 -u # 仅显示udp相关选项 -n # 拒绝显 ... 
- MongoDB 官方文档中的 aggregate 例子当中的 $sum: 1 , 这里的 1 起什么作用?
			按照 group 的条件, 满足一条就加1, db.getCollection('user_login_info').aggregate( [ {$project:{account_id:" ... 
- Python的re模块,正则表达式用法详解,正则表达式中括号的用法
			Python的re模块,正则表达式 #导入re模块 import re 1.match方法的使用: result = re.match(正则表达式,待匹配的字符串) 正则表达式写法: 第一部分: 字 ... 
