1. 程式人生 > >java實現找圖功能

java實現找圖功能

一、功能說明

1.要在螢幕中找的圖

search.png


2.測試程式碼

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);
		}
	}

指定範圍截到的圖

screen.png


結果輸出到圖片


3.列印結果

找到圖片,座標是12,100

4.額外的類

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;
	}

}