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 注 ...
随机推荐
- 37.html
转载:https://www.cnblogs.com/yuanchenqi/articles/5976755.html 前端概述 import socket def main(): sock = so ...
- 深入谷歌和甲骨文旷日持久的版权战争,趣味科普当前最火的编程语言JAVA的前世今生
这篇文章是我在B站上投稿的一个科普java的视频文案,内容如标题,感兴趣的码农朋友可以移步观看https://www.bilibili.com/video/av81171108/ 在过去短短几十年间, ...
- 【原创】(十四)Linux内存管理之page fault处理
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- DOCKER学习_004:Docker网络
一 简介 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过 ...
- vs2017编译installer项目提示缺少visualstudio2010shell(Integrated)-CHN
这个问题折腾我一天,欲仙欲死啊~~~~~~! 国内的网站各种百度,都不行. 还是Google大神比较强,在stackoverflow.com找到了解决方法,说来也简单,难者不会,会者不难! ----- ...
- Git 连接github
大概如下: 详细如下:如果使用本文命令,请仔细选择,因为添加一些相关命令以供参考. 1 本地仓库 1.1 创建git 仓库 git init # 初始化本地仓库 git --version # 查看G ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
- 1024 科学计数法 (20 分)C与Java
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部 ...
- 12.pyecharts详细使用教程
官方数据教程: 柱状图-Bar //导入柱状图-Bar from pyecharts import Bar //设置行名 columns = ["Jan", "Feb&q ...
- Ant Design中getFieldDecorator方法的特殊用法(小bug)
记录Ant Design中getFieldDecorator方法的特殊的一个用法 了解Ant Design表单的小伙伴都知道,getFieldDecorator在大部分情况下是用来绑定一个控件的,即像 ...