[java] view plain copy
public static void main(String[] args) throws Exception {
findImage4FullScreen(ImageCognition.SIM_ACCURATE_VERY)
}
public static void findImage4FullScreen(int sim) throws Exception {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize()
int w = (int) screenSize.getWidth()
int h = 200
Robot robot = new Robot()
BufferedImage screenImg = robot.createScreenCapture(new Rectangle(0, 0,
w, h))//对屏幕指定范围进行截图,保存到BufferedImage中
OutputStream out = new FileOutputStream("data/images/screen.png")
ImageIO.write(screenImg, "png", out)//将截到的BufferedImage写到本地
InputStream in = new FileInputStream("data/images/search.png")
BufferedImage searchImg = ImageIO.read(in)//将要查找的本地图读到BufferedImage
//图片识别工具类
ImageCognition ic = new ImageCognition()
List<CoordBean>list = ic.imageSearch(screenImg, searchImg, sim)
for (CoordBean coordBean : list) {
System.out.println("找到图片,坐标是" + coordBean.getX() + ","
+ coordBean.getY())
//标注找到的图的位置
Graphics g = screenImg.getGraphics()
g.setColor(Color.BLACK)
g.drawRect(coordBean.getX(), coordBean.getY(),
searchImg.getWidth(), searchImg.getHeight())
g.setFont(new Font(null, Font.BOLD, 20))
g.drawString("←找到的图片在这里",
coordBean.getX() + searchImg.getWidth() + 5,
coordBean.getY() + 10 + searchImg.getHeight() / 2)
out = new FileOutputStream("data/images/result.png")
ImageIO.write(screenImg, "png", out)
}
}
额外的类
CoordBean
package cn.xt.imgCongnition
public class CoordBean {
private int x
private int y
/**
* 获取x坐标
*
* @return x坐标
*/
public int getX() {
return x
}
public void setX(int x) {
this.x = x
}
/**
* 获取y坐标
*
* @return
*/
public int getY() {
return y
}
public void setY(int y) {
this.y = y
}
}
RgbImageComparerBean
package cn.xt.imgCongnition
/**
* RGB 相关,图片相似度计算时使用
*
*/
public class RgbImageComparerBean {
/****** 颜色值数组,第一纬度为x坐标,第二纬度为y坐标 ******/
private int colorArray[][]
/*** 是否忽略此点,若为true,则不纳入比较的像素行列。 ***/
private boolean ignorePx[][]
/**** 图片的宽高 ****/
private int imgWidth
private int imgHeight
// 图片的像素总数
private int pxCount
/**
* 获取图像的二维数组组成
*
* @return 图像的二维数组
*/
public int[][] getColorArray() {
return colorArray
}
/**
* 要对比的像素总数,会自动筛选掉不对比的颜色
*
* @param pxCount
*/
public void setPxCount(int pxCount) {
this.pxCount = pxCount
}
/**
* 设置颜色二维数组
*
* @param colorArray
*颜色二维数组,一维为x轴,二维为y轴
*/
public void setColorArray(int[][] colorArray) {
this.colorArray = colorArray
this.imgWidth = this.colorArray.length
this.imgHeight = this.colorArray[0].length
this.pxCount = this.imgWidth * this.imgHeight
}
/**
* 是否忽略此点,若为true,则不纳入像素比较行列。
*
* @return 具体x,y坐标的那个像素点
*/
public boolean[][] getIgnorePx() {
return ignorePx
}
/**
* 是否忽略此点,若为true,则不纳入像素比较行列。
*
* @param ignorePx
*具体x,y坐标的那个像素点
*/
public void setIgnorePx(boolean[][] ignorePx) {
this.ignorePx = ignorePx
}
/**
* 获取图像的宽度
*
* @return 图像宽度
*/
public int getImgWidth() {
return imgWidth
}
/**
* 获取图像的高度
*
* @return 图像高度
*/
public int getImgHeight() {
return imgHeight
}
/**
* 获取图像里像素的总数
*
* @return
*/
public int getPxCount() {
return pxCount
}
}
先获得图片左上角的颜色去屏幕里,挨个点比较……如果颜色差距在一定范围内,就认定他相等,这样能找到N个点。
获得图片其他点颜色,根据偏移,去和刚刚的N的点位置附近,寻找匹配点
如果有一个点附近的颜色都和图片颜色匹配,那就是图了
如果没有匹配的,那就是没有~
吖……说的很通俗了,不知道能不能实现~我不会JAVA
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)