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 注 ...
随机推荐
- 最近邻分类器,K近邻分类器,线性分类器
转自:https://blog.csdn.net/oldmao_2001/article/details/90665515 最近邻分类器: 通俗来讲,计算测试样本与所有样本的距离,将测试样本归为距离最 ...
- 基于 HTML5 WebGL + WebVR 的 3D 虚实现实可视化培训系统
前言 2019 年 VR, AR, XR, 5G, 工业互联网等名词频繁出现在我们的视野中,信息的分享与虚实的结合已经成为大势所趋,5G 是新一代信息通信技术升级的重要方向,工业互联网是制造业转型升级 ...
- 基于Antd框架的通信与交互
基于Antd框架的通信与交互 1.与用户交互 对于input输入框,在于用户交互的过程中,用户在输入任何东西时,都会引起该组件的onChange事件(如果写有这个方法的话). <FormItem ...
- LCA (Tarjan&倍增)
LCA_Tarjan 参考博客:https://www.cnblogs.com/JVxie/p/4854719.html LCA的Tarjan写法需要结合并查集 从叶子节点往上并 int Find ( ...
- Date类(java.util)和SimpleDateFormat类(java.text)
在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用: 使用 Date 类的默 ...
- 【C&数据结构】---关于链表结构的前序插入和后序插入
刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...
- String.valueOf(null)
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); ...
- 防止过拟合的方法 预测鸾凤花(sklearn)
1. 防止过拟合的方法有哪些? 过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合. 产生过 ...
- Activiti 规则任务(businessRuleTask)
Activiti 规则任务(businessRuleTask) 作者:Jesai 目前国内研究Activiti规则任务businessRuleTask)的文章在网上应该不超出3篇 小觑夜漫酒作伴,破晓 ...
- [apue] 一个查看当前终端标志位设置的小工具
话不多说,先看运行效果: >./term input flag 0x00000500 BRKINT not in ICRNL IGNBRK not in IGNCR not in IGNPAR ...