java實現找圖功能
阿新 • • 發佈:2019-02-19
一、功能說明
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; } }