|
|
AIWROKÈí¼þ±¾µØ´î½¨OCRÕÒ×Ö·þÎñÆ÷
- /**
- * ÇáÁ¿OCRʶ±ð - AIWROK¶Ë·â×°
- * ͨ¹ýfrpËíµÀÁ¬½Ó±¾µØµçÄÔµÄRapidOCR·þÎñ
- * ·þÎñÆ÷: http://154.201.80.51:9999 ¡ú frp ¡ú ±¾µØµçÄÔ:9999
- *
- * ·½·¨:
- * ocrRecognize(region) È«Á¿Ê¶±ð£¬·µ»ØwordsÊý×é
- * ocrFindText(text, region, mode) ²éÕÒÎÄ×Ö£¬·µ»Ø×ø±ê
- * ocrFindAndClick(text) ²éÕÒÎÄ×Ö²¢µã»÷
- * ocrGetAllText(region) ·µ»ØÈ«²¿ÎÄ×ÖÆ´½Ó
- * ocrTextExists(text) ¼ì²éÎÄ×ÖÊÇ·ñ´æÔÚ
- * ocrWaitAndClick(text, timeout) µÈ´ýÎÄ×Ö³öÏÖ²¢µã»÷
- * testOcrServer() ²âÊÔÁ¬½Ó
- *
- * Rhino ES5 ×¢ÒâÊÂÏî:
- * 1. ×Ö·û´®Æ´½Ó²úÉúConsString£¬´«¸øJava·½·¨Ç°±ØÐëÓÃ""+ǿת
- * 2. ÿ´ÎÇëÇónew okHttp()£¬²»Òª¹²ÏíʵÀý£¨setHeader»áÀÛ»ý£©
- * 3. sleepÓÃsleep.millisecond()²»ÄÜÓÃsleep(number)
- * 4. ʱ¼äÓÃnew Date().getTime()²»ÓÃDate.now()
- * 5. ½ØÍ¼¶ÔÏóÓÃimg.toBase64()²»ÓÃbitmap.compress()
- * 6. ÇøÓò½ØÍ¼ÓÃcutImagePercent(0~1°Ù·Ö±È)²»ÓÃscreen.screenShotÏñËØ
- */
- var OCR_CONFIG = {
- // ¾ÖÓòÍøÖ±Á¬£¨ÊÖ»úºÍµçÄÔͬһWiFiʱÓÃÕâ¸ö£¬²»×ßfrpËíµÀ£¬¿ì3-5±¶£©
- SERVER_LOCAL: "http://192.128.10.103:9999",
- // frpËíµÀ£¨ÊÖ»ú²»ÔÚͬһWiFiʱÓÃÕâ¸ö£¬¾·þÎñÆ÷ÖÐת£©
- SERVER_REMOTE: "http://165.201.20.51:9999",
- // µ±Ç°Ê¹ÓõķþÎñÆ÷£¬×Ô¶¯¼ì²âÓÅÏÈÓþÖÓòÍø
- SERVER: "http://192.168.10.103:9999",
- timeout: 30000
- };
- /**
- * ½ØÍ¼×ªbase64
- * @param {Array} region ¿ÉÑ¡ [x1,y1,x2,y2] °Ù·Ö±È0~100
- * @return {String} base64×Ö·û´®
- */
- function ocrScreenshot(region) {
- var img;
- if (region && region.length >= 4) {
- // regionÊǰٷֱÈ0~100£¬cutImagePercentÓÃ0~1
- var x1 = region[0] / 100;
- var y1 = region[1] / 100;
- var x2 = region[2] / 100;
- var y2 = region[3] / 100;
- img = screen.screenShotFull().cutImagePercent(x1, y1, x2, y2);
- } else {
- img = screen.screenShotFull();
- }
- if (!img) {
- throw new Error("½ØÍ¼Ê§°Ü");
- }
- // AIWROK Image¶ÔÏó×Ô´øtoBase64()£¬·µ»ØJava×Ö·û´®ÐèÓÃ""+ǿתJS×Ö·û´®
- var b64 = "" + img.toBase64();
- // ÊͷŽØÍ¼¶ÔÏó
- try { img.recycle(); } catch(e) {}
- return b64;
- }
- /**
- * ·¢ËÍOCRÇëÇó
- * ÓÃhttp.json()Ìæ´úhttp.post()£¬Ö±½Ó´«¶ÔÏó²»ÊÖ¶¯JSON.stringify
- * ÕâÑù²»»á²úÉúConsStringÀàÐÍÎÊÌ⣨ÒÑÑéÖ¤http.json()ÄÜÅÜͨ£©
- * @param {String} apiPath ½Ó¿Ú·¾¶
- * @param {Object} params ÇëÇó²ÎÊý
- * @return {Object|null} ½âÎöºóµÄJSON
- */
- function ocrRequest(apiPath, params) {
- var http = new okHttp();
- http.setHeader("Content-Type", "application/json");
- try {
- // http.json(url, object) Ö±½Ó´«¶ÔÏó£¬okHttpÄÚ²¿ÐòÁл¯
- // ²Î¿¼ÒÑÑéÖ¤ÄÜÅÜͨµÄOCR²âÊÔ_AIWROK¶Ë.jsµÚ260ÐÐ
- var resp = "" + http.json(OCR_CONFIG.SERVER + apiPath, params || {});
- if (!resp || resp.length === 0) {
- printl("[OCR] ·µ»Ø¿ÕÏìÓ¦");
- return null;
- }
- return JSON.parse(resp);
- } catch (e) {
- printl("[OCR] ÇëÇóʧ°Ü: " + e);
- return null;
- }
- }
- /**
- * È«Á¿OCRʶ±ð
- * @param {Array} region ¿ÉÑ¡ [x1,y1,x2,y2] °Ù·Ö±È
- * @return {Array} wordsÊý×é [{text,score,box}]
- */
- function ocrRecognize(region) {
- var b64 = ocrScreenshot(region);
- var params = { image: b64 };
- if (region) params.region = region;
- var resp = ocrRequest("/ocr", params);
- if (!resp || resp.code != 0) {
- printl("[OCR] ʶ±ðʧ°Ü: " + (resp ? resp.error : "ÎÞÏìÓ¦"));
- return [];
- }
- return resp.words || [];
- }
- /**
- * ²éÕÒÎÄ×Ö
- * @param {String} text Òª²éÕÒµÄÎÄ×Ö
- * @param {Array} region ¿ÉÑ¡ÇøÓò
- * @param {String} mode exact=¾«È·Æ¥Åä, include=°üº¬Æ¥Åä
- * @return {Array} Æ¥Åä½á¹û [{text,x,y,score,box}]
- */
- function ocrFindText(text, region, mode) {
- var b64 = ocrScreenshot(region);
- var params = {
- image: b64,
- text: text,
- mode: mode || "include"
- };
- if (region) params.region = region;
- var resp = ocrRequest("/ocr_find", params);
- if (!resp || resp.code != 0) {
- printl("[OCR] ²éÕÒʧ°Ü: " + (resp ? resp.error : "ÎÞÏìÓ¦"));
- return [];
- }
- return resp.found || [];
- }
- /**
- * ²éÕÒÎÄ×Ö²¢µã»÷
- * @param {String} text Òª²éÕÒµÄÎÄ×Ö
- * @param {Array} region ¿ÉÑ¡ÇøÓò
- * @return {Boolean} ÊÇ·ñµã»÷³É¹¦
- */
- function ocrFindAndClick(text, region) {
- var found = ocrFindText(text, region, "include");
- if (found.length > 0) {
- var item = found[0];
- var sw = screen.getScreenWidth();
- var sh = screen.getScreenHeight();
- var absX, absY;
- if (region && region.length >= 4) {
- var rx1 = Math.round(region[0] * sw / 100);
- var ry1 = Math.round(region[1] * sh / 100);
- absX = rx1 + item.x;
- absY = ry1 + item.y;
- } else {
- absX = item.x;
- absY = item.y;
- }
- // Ëæ»úÆ«ÒÆ¡À5pxÄâÈË»¯
- absX += Math.floor(Math.random() * 10) - 5;
- absY += Math.floor(Math.random() * 10) - 5;
- printl("[OCR] ÕÒµ½'" + text + "' ×ø±ê(" + absX + "," + absY + ") µã»÷");
- auto.clickPoint(absX, absY);
- return true;
- }
- return false;
- }
- /**
- * »ñȡȫ²¿ÎÄ×Ö
- * @param {Array} region ¿ÉÑ¡ÇøÓò
- * @return {String} È«²¿ÎÄ×ÖÆ´½Ó
- */
- function ocrGetAllText(region) {
- var b64 = ocrScreenshot(region);
- var params = { image: b64 };
- if (region) params.region = region;
- var resp = ocrRequest("/ocr_all", params);
- if (!resp || resp.code != 0) {
- return "";
- }
- return resp.all_text || "";
- }
- /**
- * ¼ì²éÎÄ×ÖÊÇ·ñ´æÔÚ
- * @param {String} text Òª¼ì²éµÄÎÄ×Ö
- * @param {Array} region ¿ÉÑ¡ÇøÓò
- * @return {Boolean}
- */
- function ocrTextExists(text, region) {
- var found = ocrFindText(text, region, "include");
- return found.length > 0;
- }
- /**
- * µÈ´ýÎÄ×Ö³öÏÖ²¢µã»÷
- * @param {String} text µÈ´ýµÄÎÄ×Ö
- * @param {Number} timeout ³¬Ê±ÃëÊý
- * @param {Array} region ¿ÉÑ¡ÇøÓò
- * @return {Boolean}
- */
- function ocrWaitAndClick(text, timeout, region) {
- var maxTime = (timeout || 10) * 1000;
- var startTime = new Date().getTime();
- while (new Date().getTime() - startTime < maxTime) {
- if (ocrFindAndClick(text, region)) {
- return true;
- }
- sleep.millisecond(1000);
- }
- printl("[OCR] µÈ´ý'" + text + "'³¬Ê±");
- return false;
- }
- /**
- * ²âÊÔOCR·þÎñÁ¬½Ó
- * @return {Boolean}
- */
- function testOcrServer() {
- try {
- var http = new okHttp();
- var resp = "" + http.get(OCR_CONFIG.SERVER + "/health");
- var data = JSON.parse(resp);
- if (data.code == 0) {
- printl("[OCR] ·þÎñÁ¬½ÓÕý³£!");
- printl("[OCR] ÒýÇæ: " + data.engine);
- printl("[OCR] ÒѼÓÔØ: " + data.loaded);
- return true;
- }
- } catch (e) {
- printl("[OCR] Á¬½Óʧ°Ü: " + e);
- printl("[OCR] Çë¼ì²é: 1.±¾µØOCR·þÎñÊÇ·ñÆô¶¯ 2.frp¿Í»§¶ËÊÇ·ñÆô¶¯");
- }
- return false;
- }
- // ===== ʹÓÃʾÀý =====
- function main() {
- printl("===== ÇáÁ¿OCR²âÊÔ =====");
- // ²âÊÔÁ¬½Ó
- if (!testOcrServer()) {
- return;
- }
- // È«Á¿Ê¶±ð
- printl("\n--- È«Á¿Ê¶±ð ---");
- var words = ocrRecognize();
- for (var i = 0; i < words.length; i++) {
- printl(" [" + i + "] " + words[i].text + " (score=" + words[i].score + ")");
- }
- // »ñȡȫ²¿ÎÄ×Ö
- printl("\n--- È«²¿ÎÄ×Ö ---");
- var allText = ocrGetAllText();
- printl(allText);
- // ²éÕÒÎÄ×Ö
- printl("\n--- ²éÕÒÎÄ×Ö ---");
- var found = ocrFindText("ÉèÖÃ");
- if (found.length > 0) {
- printl("ÕÒµ½'ÉèÖÃ': " + found[0].x + "," + found[0].y);
- } else {
- printl("δÕÒµ½'ÉèÖÃ'");
- }
- printl("\n===== ²âÊÔÍê³É =====");
- }
- // ×Ô¶¯Ö´ÐвâÊÔ
- main();
¸´ÖÆ´úÂë
|
|