|  | 
 
| AIWROKÈí¼þÆ»¹ûIOSϵͳͼɫÊÓ¾õ[opencv]·½·¨Ð¡½á 
 ![AIWROKÈí¼þÆ»¹ûIOSϵͳͼɫÊÓ¾õ[opencv]·½·¨Ð¡½á B2BÍøÂçÈí¼þ  AIWROKÈí¼þÆ»¹ûIOSϵͳͼɫÊÓ¾õ[opencv]·½·¨Ð¡½á B2BÍøÂçÈí¼þ](static/image/common/none.gif)  
 
 ·½·¨ 1£ºcv ÎļþÕÒͼ£¨Ä£°æÆ¥Åä cv ÕÒͼ£©¸´ÖÆ´úÂë/*
🍎½»Á÷ QQ Ⱥ 711841924 Ⱥһ£¬Æ»¹ûÄÚ²âȺ£¬528816639
🍎OpenCV ͼÏñ´¦Àí·½·¨Ð¡½á
*/
//🍎OpenCV Àà [opencv] ·½·¨Ð¡½á
// µÚÒ»¸ö·½·¨£º📌findImagesEx - cvÎļþÕÒͼ£¨Ä£°åÆ¥ÅäcvÕÒͼ£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚcvÎļþ½øÐÐÄ£°åÆ¥ÅäÕÒͼ£¬·µ»ØÆ¥Åäµ½µÄÄ¿±êÊý×é
·½·¨Ç©Ãû Detect[] opencv.findImagesEx (String cvFile)
·µ»ØÖµ Detect[]£¨Æ¥Åäµ½µÄÄ¿±êÊý×飬ÿ¸öÔªËØ°üº¬Î»Öá¢ÏàËÆ¶ÈµÈÐÅÏ¢£©
²ÎÊý - String cvFile£ºcv¸ñʽµÄÄ£°åÎļþ·¾¶
*/
// ʾÀý£º»ùÓÚcvÎļþÕÒͼ
let findResults = opencv.findImagesEx("./template.cv");
print.log("cvÎļþÕÒͼ½á¹û£º", findResults);
// µÚ¶þ¸ö·½·¨£º📌OCREx - cvÎļþOCR£¨Ä£°åÆ¥ÅäOCR£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚcvÎļþÄ£°å½øÐÐÎÄ×Öʶ±ð£¬·µ»ØOCRʶ±ð½á¹û
·½·¨Ç©Ãû OcrResult opencv.OCREx (String cvFile)
·µ»ØÖµ OcrResult£¨OCRʶ±ð½á¹û¶ÔÏ󣬰üº¬Ê¶±ðµ½µÄÎÄ×Ö¼°Î»ÖÃÐÅÏ¢£©
²ÎÊý - String cvFile£ºcv¸ñʽµÄOCRÄ£°åÎļþ·¾¶
*/
// ʾÀý£º»ùÓÚcvÎļþ½øÐÐOCRʶ±ð
let ocrResult = opencv.OCREx("./textTemplate.cv");
print.log("OCRʶ±ðÎÄ×Ö£º", ocrResult.text);
// µÚÈý¸ö·½·¨£º📌templateMatch - ¶àÄ£°åÆ¥Åä²éÕÒÄ¿±ê¶ÔÏó
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚ¶à¸öÄ£°åͼƬÔÚÖ¸¶¨Í¼ÏñÖÐÆ¥ÅäÄ¿±ê£¬¿ÉÉèÖÃÆ¥ÅäÇøÓò¡¢ãÐÖµµÈ
·½·¨Ç©Ãû Detect[] opencv.templateMatch (Mat mat, String[] templates, Double threshold, Double[] roi, Boolean best)
·µ»ØÖµ Detect[]£¨Æ¥Åäµ½µÄÄ¿±êÊý×飩
²ÎÊý - Mat mat£º´ýÆ¥ÅäµÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- String[] templates£ºÄ£°åͼƬ·¾¶Êý×é
- Double threshold£ºÆ¥ÅäãÐÖµ£¨0-1£¬ÖµÔ½¸ßÆ¥ÅäÔ½Ñϸñ£©
- Double[] roi£ºÆ¥ÅäÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]£¬Ä¬ÈÏȫͼ [0,0,1,1]
- Boolean best£ºÊÇ·ñÖ»·µ»Ø×îÓÅÆ¥Åä½á¹û£¨trueÔòÖ»·µ»Ø×î¼ÑÆ¥Å䣬false·µ»ØËùÓзûºÏãÐÖµµÄ½á¹û£©
*/
// ʾÀý£º¶àÄ£°åÆ¥ÅäÖ¸¶¨ÇøÓò
const templates = ["./tpl1.png", "./tpl2.png"];
const matchResults = opencv.templateMatch(mat, templates, 0.8, [0.2, 0.2, 0.6, 0.6], true);
print.log("Ä£°åÆ¥Åä½á¹û£º", matchResults);
// µÚËĸö·½·¨£º📌findImages - ¶àͼ²éÕÒ£¨Ö§³Ö³¬Ê±ºÍÖÊÁ¿ÉèÖã©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ Í¬Ê±²éÕÒ¶àÕÅÏàËÆÍ¼Æ¬£¬³¬Ê±Î´ÕÒµ½Ôò·µ»Ønull£»¿ÉÉèÖýØÍ¼ÖÊÁ¿¡¢³¬Ê±Ê±¼äµÈ
·½·¨Ç©Ãû Detect[]|null opencv.findImages (String[] images, Double threshold, Int32 timeOut, Int32 quality, Double[] rects)
·µ»ØÖµ Detect[]|null£¨Æ¥Åä³É¹¦·µ»ØÄ¿±êÊý×飬ʧ°Ü·µ»Ønull£©
²ÎÊý - String[] images£º´ý²éÕÒµÄͼƬ·¾¶Êý×é
- Double threshold£ºÏàËÆ¶ÈãÐÖµ£¨0-1£©
- Int32 timeOut£º³¬Ê±Ê±¼ä£¨ºÁÃ룬³¬¹ý¸Ãʱ¼äδÕÒµ½Ôò·µ»Ønull£©
- Int32 quality£ºÆÁÄ»½ØÍ¼ÖÊÁ¿£¨0£º±êÇ壬1£º¸ßÇ壬2£º³¬Ç壩
- Double[] rects£º²éÕÒÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]£¬Ä¬ÈÏȫͼ
*/
// ʾÀý£º¶àͼ²éÕÒ²¢ÉèÖó¬Ê±
const targetImages = ["./img1.png", "./img2.png"];
const multiFindResults = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
if (multiFindResults) {
  print.log("¶àͼ²éÕҳɹ¦£¬½á¹û£º", multiFindResults);
} else {
  print.err("¶àͼ²éÕÒ³¬Ê±»òʧ°Ü");
}
// µÚÎå¸ö·½·¨£º📌toGray - ͼÏñת»Ò¶Èͼ
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ½«ÊäÈëµÄMatͼÏñת»»Îª»Ò¶Èͼ£¨Ö±½ÓÐÞ¸ÄÔʼMat¶ÔÏó£©
·½·¨Ç©Ãû void opencv.toGray (Mat src)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ýת»»µÄÔʼͼÏñ£¨Mat¶ÔÏó£©
*/
// ʾÀý£º½«Í¼ÏñתΪ»Ò¶Èͼ
const grayMat = image.getMat(); // ¼ÙÉè´Óimage¶ÔÏó»ñÈ¡Mat
opencv.toGray(grayMat);
print.log("ͼÏñÒÑתΪ»Ò¶Èͼ£º", grayMat);
// µÚÁù¸ö·½·¨£º📌extractRegion - ͼÏñ²ÃÇУ¨´Ó´óͼÖнØÍ¼²ÃÇУ©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ °´°Ù·Ö±ÈÇøÓò²ÃÇÐͼÏñ£¬¿ÉÑ¡Ôñ½ö±£Áô²ÃÇв¿·Ö»ò±£ÁôÔͼ´óС£¨ÆäËûÇøÓò±ä°×£©
·½·¨Ç©Ãû void opencv.extractRegion (Mat sourceImage, Double[] roiPercent, Boolean iscut)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat sourceImage£º´ý²ÃÇеÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- Double[] roiPercent£º²ÃÇÐÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]
- Boolean iscut£º²ÃÇÐģʽ£¨true½ö±£Áô²ÃÇÐÇøÓò£»false±£ÁôÔͼ´óС£¬ÆäËûÇøÓò±ä°×£©
*/
// ʾÀý£º²ÃÇÐͼÏñÖмä50%ÇøÓò²¢½ö±£Áô²ÃÇв¿·Ö
opencv.extractRegion(mat, [0.25, 0.25, 0.5, 0.5], true);
print.log("ͼÏñÒѲÃÇУº", mat);
// µÚÆß¸ö·½·¨£º📌threshold - ͼÏñ¶þÖµ»¯´¦Àí
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ½«Í¼Ïñת»»ÎªºÚ°×¶þֵͼ£¨ÏñËØÖµÔÚ[min, max]Çø¼äÍâΪºÚÉ«£¬Çø¼äÄÚΪ°×É«£©
·½·¨Ç©Ãû void opencv.threshold (Mat src, Int32 min, Int32 max)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ý¶þÖµ»¯µÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- Int32 min£º¶þÖµ»¯×îСãÐÖµ£¨0-255£©
- Int32 max£º¶þÖµ»¯×î´óãÐÖµ£¨0-255£©
*/
// ʾÀý£º½ØÆÁ²¢½øÐжþÖµ»¯´¦Àí£¨º¬ºóÐøÁ÷³Ì£©
const binImg = screen.screenShotFull();
const binMat = binImg.getMat();
opencv.threshold(binMat, 50, 200); // ãÐÖµÇø¼ä50-200
// תImage²¢OCRʶ±ð
const binImg2 = new Image();
binImg2.readMat(binMat);
const ocrRes = binImg2.ocr(0, 0, 1, 1);
print.log("¶þÖµ»¯ºóOCR½á¹û£º", ocrRes);
// ÊÍ·ÅÄÚ´æ
binMat.close();
binImg.close();
binImg2.close();
// µÚ°Ë¸ö·½·¨£º📌invertColor - ͼÏñÑÕÉ«·×ª£¨·´É«´¦Àí£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ¶ÔͼÏñ½øÐÐÑÕÉ«·×ª£¬½«Ã¿¸öÏñËØµÄRGBÖµ·´×ª£¨Èç°×É«¡úºÚÉ«¡¢ºìÉ«¡úÇàÉ«µÈ£©
·½·¨Ç©Ãû void opencv.invertColor (Mat src)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ýÑÕÉ«·×ªµÄÔʼͼÏñ£¨Mat¶ÔÏó£©
*/
// ʾÀý£º·×ªÍ¼ÏñÑÕÉ«
const invertMat = image.getMat();
opencv.invertColor(invertMat);
print.log("ÑÕÉ«ÒѷתµÄͼÏñ£º", invertMat);
·½·¨ 2£ºcv Îļþ OCR£¨Ä£°æÆ¥Åä OCR£©| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | cv ÎļþÕÒͼ¡¢Ä£°æÆ¥Åä cv ÕÒͼ |  | ·½·¨ | Detect[] findImagesEx(String cvFile) |  | ·µ»ØÖµ | Detect[] |  | ²ÎÊý | String cvFile : cv Îļþ cv Îļþ |  | °¸Àý | opencv.findImagesEx("") | 
 ·½·¨ 3£ºÄ£°æÆ¥Å䣨ͨ¹ýÄ£°æÆ¥ÅäÕÒµ½Ä¿±ê¶ÔÏó£©| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | cv Îļþ OCR¡¢Ä£°æÆ¥Åä OCR |  | ·½·¨ | OcrResult OCREx(String cvFile) |  | ·µ»ØÖµ | OcrResult |  | ²ÎÊý | String cvFile : cv Îļþ cv Îļþ |  | °¸Àý | opencv.OCREx("") | 
 ·½·¨ 4£ºÕÒ¶àͼ| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | Ä£°æÆ¥Å䣻ͨ¹ýÄ£°æÆ¥ÅäÕÒµ½Ä¿±ê¶ÔÏó |  | ·½·¨ | Detect[] templateMatch(Mat mat, String[] templates, Double threshold, Double[] roi, Boolean best) |  | ·µ»ØÖµ | Detect[] |  | ²ÎÊý | Mat mat : mat ÀàÐÍͼƬString[] templates
 : Ä£°æÍ¼Æ¬Êý×éDouble threshold
 : ãÐÖµ 0-1Double[] roi
 : ÇøÓòÊý×é[0,0,1,1] Boolean best
 : ÊÇ·ñÖ»·µ»Ø×îÓŽâ |  | °¸Àý | opencv.templateMatch(Mat, String[], Double, Double[], true) | 
 ·½·¨ 5£º×ª»Ò¶Èͼ£¨Í¼Ïñת»Ò¶Èͼ£©| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | ÕÒ¶àͼ |  | ˵Ã÷ | ÕÒͼ£¬¿ÉÉèÖöàÕÅÏàËÆÍ¼Æ¬£»ÕÒͼ³É¹¦·µ»ØÄ¿±êÊý×飬ʧ°Ü·µ»Ønull |  | ·½·¨ | Detect[] findImages(String[] images, Double threshold, Int32 timeOut, Int32 quality, Double[] rects) |  | ·µ»ØÖµ | Detect[] |  | ²ÎÊý | String[] images : ͼƬÊý×éDouble threshold
 : ÏàËÆ¶È 0-1Int32 timeOut
 : ³¬Ê±Ê±¼ä£¨ºÁÃ룬³¬Ê±Î´ÕÒµ½ÔòÍ˳ö£©Int32 quality
 : ÆÁÄ»½ØÍ¼ÖÊÁ¿£¨0 ±êÇå¡¢1 ¸ßÇå¡¢2 ³¬Ç壩Double[] rects
 : °Ù·Ö±ÈÇøÓò |  | °¸Àý | opencv.findImages(String[], Double, Int32, Int32, Double[]) | 
 ·½·¨ 6£º²ÃÇÐͼƬ£¨´Ó´óͼÖнØÍ¼²ÃÇÐͼƬ£©| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | ת»Ò¶Èͼ |  | ˵Ã÷ | ͼÏñת»Ò¶Èͼ |  | ·½·¨ | Void toGray(Mat src) |  | ·µ»ØÖµ | Void |  | ²ÎÊý | Mat src : mat ͼÏñ mat ͼÏñ |  | °¸Àý | opencv.toGray(Mat) | 
 ·½·¨ 7£º¶þÖµ»¯| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | ²ÃÇÐͼƬ |  | ˵Ã÷ | ´Ó´óͼÖнØÍ¼²ÃÇÐͼƬ |  | ·½·¨ | Void extractRegion(Mat sourceImage, Double[] roiPercent, Boolean iscut) |  | ·µ»ØÖµ | Void |  | ²ÎÊý | Mat sourceImage : mat ͼÏñ mat ͼÏñDouble[] roiPercent
 : ²ÃÇÐÇøÓò°Ù·ÖÊýÊý×éBoolean iscut
 : true Ö»±£Áô²ÃÇв¿·Ö£¬false ͼƬ´óС²»±ä¡¢ÆäËûÇøÓò±ä°× |  | °¸Àý | opencv.extractRegion(Mat, Double[], true) | 
 ·½·¨ 8£ºÑÕÉ«·×ª| Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | ¶þÖµ»¯ |  | ·½·¨ | Void threshold(Mat src, Int32 min, Int32 max) |  | ·µ»ØÖµ | Void |  | ²ÎÊý | Mat src : mat ¸ñʽͼƬInt32 min
 : ×îСãÐÖµInt32 max
 : ×î´óãÐÖµ |  | °¸Àý | // ½ØÆÁ²¢×ª³É mat ¸ñʽ var img = screen.screenShotFull(); var mat = img.getMat(); // ¶þÖµ»¯²Ù×÷£¨Ê¾Àýº¬ºóÐøÁ÷³Ì£º×ª Image¡¢OCR¡¢ÊÍ·ÅÄÚ´æµÈ£© opencv.threshold(mat, 50, 200); var img2 = new Image(); img2.readMat(mat); printl(img2); var ocrres = img2.ocr(0, 0, 1, 1); printl(ocrres); // ÊÍ·ÅÄÚ´æ mat.close(); img.close(); img2.close(); | 
 | Àà±ð | ÄÚÈÝ |  | Ö÷Ìâ | ÑÕÉ«·×ª |  | ·½·¨ | Void invertColor(Mat src) |  | ·µ»ØÖµ | Void |  | ²ÎÊý | Mat src : mat ¸ñʽͼƬ |  | °¸Àý | opencv.invertColor(Mat) | 
 ʵսʵÀý£º ¸´ÖÆ´úÂë// ... existing code ...
/*
🍎½»Á÷ QQ Ⱥ 711841924 Ⱥһ£¬Æ»¹ûÄÚ²âȺ£¬528816639
🍎OpenCV ͼÏñ´¦Àí·½·¨Ð¡½á
*/
//🍎OpenCV Àà [opencv] ·½·¨Ð¡½á
// µÚÒ»¸ö·½·¨£º📌findImagesEx - cvÎļþÕÒͼ£¨Ä£°åÆ¥ÅäcvÕÒͼ£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚcvÎļþ½øÐÐÄ£°åÆ¥ÅäÕÒͼ£¬·µ»ØÆ¥Åäµ½µÄÄ¿±êÊý×é
·½·¨Ç©Ãû Detect[] opencv.findImagesEx (String cvFile)
·µ»ØÖµ Detect[]£¨Æ¥Åäµ½µÄÄ¿±êÊý×飬ÿ¸öÔªËØ°üº¬Î»Öá¢ÏàËÆ¶ÈµÈÐÅÏ¢£©
²ÎÊý - String cvFile£ºcv¸ñʽµÄÄ£°åÎļþ·¾¶
*/
// ʾÀý£º»ùÓÚcvÎļþÕÒͼ
function findImagesExExample() {
    printl("=== findImagesEx ·½·¨Ê¾Àý ===");
    try {
        // ʹÓÃcvÎļþ²éÕÒͼÏñ
        let findResults = opencv.findImagesEx("ͼɫ961575.cv");
        printl("cvÎļþÕÒͼ½á¹û£º", findResults);
        
        if (findResults && findResults.length > 0) {
            printl("ÕÒµ½ " + findResults.length + " ¸öÆ¥ÅäÄ¿±ê");
            for (let i = 0; i < findResults.length; i++) {
                let result = findResults[i];
                printl("  Ä¿±ê" + (i+1) + ": ÏàËÆ¶È=" + result.score() + ", λÖÃ=" + result.getRect().toString());
            }
        } else {
            printl("δÕÒµ½Æ¥ÅäÄ¿±ê");
        }
    } catch (error) {
        printl("findImagesExÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
findImagesExExample();
// µÚ¶þ¸ö·½·¨£º📌OCREx - cvÎļþOCR£¨Ä£°åÆ¥ÅäOCR£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚcvÎļþÄ£°å½øÐÐÎÄ×Öʶ±ð£¬·µ»ØOCRʶ±ð½á¹û
·½·¨Ç©Ãû OcrResult opencv.OCREx (String cvFile)
·µ»ØÖµ OcrResult£¨OCRʶ±ð½á¹û¶ÔÏ󣬰üº¬Ê¶±ðµ½µÄÎÄ×Ö¼°Î»ÖÃÐÅÏ¢£©
²ÎÊý - String cvFile£ºcv¸ñʽµÄOCRÄ£°åÎļþ·¾¶
*/
// ʾÀý£º»ùÓÚcvÎļþ½øÐÐOCRʶ±ð
function ocrExExample() {
    printl("=== OCREx ·½·¨Ê¾Àý ===");
    try {
        var ocr1=opencv.OCREx('ͼɫ995593.cv');
        if(ocr1!=null){
           printl(ocr1.getAllString());
        } else {
           printl("OCRʶ±ðʧ°Ü»òδʶ±ðµ½ÎÄ×Ö");
        }
    } catch (error) {
        printl("OCRExÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
ocrExExample();
// µÚÈý¸ö·½·¨£º📌templateMatch - ¶àÄ£°åÆ¥Åä²éÕÒÄ¿±ê¶ÔÏó
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ »ùÓÚ¶à¸öÄ£°åͼƬÔÚÖ¸¶¨Í¼ÏñÖÐÆ¥ÅäÄ¿±ê£¬¿ÉÉèÖÃÆ¥ÅäÇøÓò¡¢ãÐÖµµÈ
·½·¨Ç©Ãû Detect[] opencv.templateMatch (Mat mat, String[] templates, Double threshold, Double[] roi, Boolean best)
·µ»ØÖµ Detect[]£¨Æ¥Åäµ½µÄÄ¿±êÊý×飩
²ÎÊý - Mat mat£º´ýÆ¥ÅäµÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- String[] templates£ºÄ£°åͼƬ·¾¶Êý×é
- Double threshold£ºÆ¥ÅäãÐÖµ£¨0-1£¬ÖµÔ½¸ßÆ¥ÅäÔ½Ñϸñ£©
- Double[] roi£ºÆ¥ÅäÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]£¬Ä¬ÈÏȫͼ [0,0,1,1]
- Boolean best£ºÊÇ·ñÖ»·µ»Ø×îÓÅÆ¥Åä½á¹û£¨trueÔòÖ»·µ»Ø×î¼ÑÆ¥Å䣬false·µ»ØËùÓзûºÏãÐÖµµÄ½á¹û£©
*/
// ʾÀý£º¶àÄ£°åÆ¥ÅäÖ¸¶¨ÇøÓò
function templateMatchExample() {
    printl("=== templateMatch ·½·¨Ê¾Àý ===");
    try {
        // ½ØÍ¼»ñȡͼÏñ
        const screenshot = screen.screenShotFull();
        const mat = screenshot.getMat();
        
        // ¶¨ÒåÄ£°åͼƬ·¾¶Êý×飨Çë¸ù¾Ýʵ¼ÊÇé¿öÐ޸ķ¾¶£©
        const templates = ["./template1.png", "./template2.png"];
        
        // ÔÚÖ¸¶¨ÇøÓò½øÐÐÄ£°åÆ¥Åä
        const matchResults = opencv.templateMatch(mat, templates, 0.8, [0.2, 0.2, 0.6, 0.6], true);
        printl("Ä£°åÆ¥Åä½á¹û£º", matchResults);
        
        if (matchResults && matchResults.length > 0) {
            printl("ÕÒµ½ " + matchResults.length + " ¸öÆ¥ÅäÄ¿±ê");
            for (let i = 0; i < matchResults.length; i++) {
                let result = matchResults[i];
                printl("  Ä¿±ê" + (i+1) + ": ÏàËÆ¶È=" + result.score() + ", λÖÃ=" + result.getRect().toString());
            }
        } else {
            printl("δÕÒµ½Æ¥ÅäÄ¿±ê");
        }
        
        // ÊÍ·Å×ÊÔ´
        mat.close();
        screenshot.close();
    } catch (error) {
        printl("templateMatchÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
// templateMatchExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// µÚËĸö·½·¨£º📌findImages - ¶àͼ²éÕÒ£¨Ö§³Ö³¬Ê±ºÍÖÊÁ¿ÉèÖã©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ Í¬Ê±²éÕÒ¶àÕÅÏàËÆÍ¼Æ¬£¬³¬Ê±Î´ÕÒµ½Ôò·µ»Ønull£»¿ÉÉèÖýØÍ¼ÖÊÁ¿¡¢³¬Ê±Ê±¼äµÈ
·½·¨Ç©Ãû Detect[]|null opencv.findImages (String[] images, Double threshold, Int32 timeOut, Int32 quality, Double[] rects)
·µ»ØÖµ Detect[]|null£¨Æ¥Åä³É¹¦·µ»ØÄ¿±êÊý×飬ʧ°Ü·µ»Ønull£©
²ÎÊý - String[] images£º´ý²éÕÒµÄͼƬ·¾¶Êý×é
- Double threshold£ºÏàËÆ¶ÈãÐÖµ£¨0-1£©
- Int32 timeOut£º³¬Ê±Ê±¼ä£¨ºÁÃ룬³¬¹ý¸Ãʱ¼äδÕÒµ½Ôò·µ»Ønull£©
- Int32 quality£ºÆÁÄ»½ØÍ¼ÖÊÁ¿£¨0£º±êÇ壬1£º¸ßÇ壬2£º³¬Ç壩
- Double[] rects£º²éÕÒÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]£¬Ä¬ÈÏȫͼ
*/
// ʾÀý£º¶àͼ²éÕÒ²¢ÉèÖó¬Ê±
function findImagesExample() {
    printl("=== findImages ·½·¨Ê¾Àý ===");
    try {
        // ¶¨ÒåÒª²éÕÒµÄͼƬ·¾¶Êý×飨Çë¸ù¾Ýʵ¼ÊÇé¿öÐ޸ķ¾¶£©
        const targetImages = ["ͼɫ961575.cv"];
        
        // ²éÕÒͼƬ£¬ÉèÖÃãÐÖµ0.7£¬³¬Ê±Ê±¼ä3000ms£¬¸ßÇåÖÊÁ¿£¬È«Í¼²éÕÒ
        const multiFindResults = opencv.findImages(targetImages, 0.7, 3000, 1, [0, 0, 1, 1]);
        
        if (multiFindResults) {
            printl("¶àͼ²éÕҳɹ¦£¬½á¹û£º", multiFindResults);
            printl("ÕÒµ½ " + multiFindResults.length + " ¸öÆ¥ÅäÄ¿±ê");
            for (let i = 0; i < multiFindResults.length; i++) {
                let result = multiFindResults[i];
                printl("  Ä¿±ê" + (i+1) + ": ÏàËÆ¶È=" + result.score() + ", λÖÃ=" + result.getRect().toString());
            }
        } else {
            printl("¶àͼ²éÕÒ³¬Ê±»òʧ°Ü");
        }
    } catch (error) {
        printl("findImagesÖ´Ðгö´í: " + error.message); // ÐÞ¸´£ºÊ¹ÓÃprintl¶ø²»ÊÇprint.err
    }
}
// µ÷ÓÃʾÀý
findImagesExample();
// µÚÎå¸ö·½·¨£º📌toGray - ͼÏñת»Ò¶Èͼ
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ½«ÊäÈëµÄMatͼÏñת»»Îª»Ò¶Èͼ£¨Ö±½ÓÐÞ¸ÄÔʼMat¶ÔÏó£©
·½·¨Ç©Ãû void opencv.toGray (Mat src)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ýת»»µÄÔʼͼÏñ£¨Mat¶ÔÏó£©
*/
// ʾÀý£º½«Í¼ÏñתΪ»Ò¶Èͼ
function toGrayExample() {
    printl("=== toGray ·½·¨Ê¾Àý ===");
    try {
        // ½ØÍ¼»ñȡͼÏñ
        const grayImage = screen.screenShotFull();
        const grayMat = grayImage.getMat();
        
        // ת»»Îª»Ò¶Èͼ
        opencv.toGray(grayMat);
        printl("ͼÏñÒÑתΪ»Ò¶Èͼ");
        
        // ±£´æ´¦ÀíºóµÄͼÏñ£¨¿ÉÑ¡£©
        // grayImage.save("/sdcard/gray_image.png");
        
        // ÊÍ·Å×ÊÔ´
        grayMat.close();
        grayImage.close();
    } catch (error) {
        printl("toGrayÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
// toGrayExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// µÚÁù¸ö·½·¨£º📌extractRegion - ͼÏñ²ÃÇУ¨´Ó´óͼÖнØÍ¼²ÃÇУ©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ °´°Ù·Ö±ÈÇøÓò²ÃÇÐͼÏñ£¬¿ÉÑ¡Ôñ½ö±£Áô²ÃÇв¿·Ö»ò±£ÁôÔͼ´óС£¨ÆäËûÇøÓò±ä°×£©
·½·¨Ç©Ãû void opencv.extractRegion (Mat sourceImage, Double[] roiPercent, Boolean iscut)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat sourceImage£º´ý²ÃÇеÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- Double[] roiPercent£º²ÃÇÐÇøÓò°Ù·Ö±ÈÊý×飬¸ñʽΪ [x, y, width, height]
- Boolean iscut£º²ÃÇÐģʽ£¨true½ö±£Áô²ÃÇÐÇøÓò£»false±£ÁôÔͼ´óС£¬ÆäËûÇøÓò±ä°×£©
*/
// ʾÀý£º²ÃÇÐͼÏñÖмä50%ÇøÓò²¢½ö±£Áô²ÃÇв¿·Ö
function extractRegionExample() {
    printl("=== extractRegion ·½·¨Ê¾Àý ===");
    try {
        // ½ØÍ¼»ñȡͼÏñ
        const extractImage = screen.screenShotFull();
        const extractMat = extractImage.getMat();
        
        // ²ÃÇÐͼÏñÖмä50%ÇøÓò²¢½ö±£Áô²ÃÇв¿·Ö
        opencv.extractRegion(extractMat, [0.25, 0.25, 0.5, 0.5], true);
        printl("ͼÏñÒѲÃÇÐ");
        
        // ±£´æ´¦ÀíºóµÄͼÏñ£¨¿ÉÑ¡£©
        // extractImage.save("/sdcard/cropped_image.png");
        
        // ÊÍ·Å×ÊÔ´
        extractMat.close();
        extractImage.close();
    } catch (error) {
        printl("extractRegionÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
// extractRegionExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// µÚÆß¸ö·½·¨£º📌threshold - ͼÏñ¶þÖµ»¯´¦Àí
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ½«Í¼Ïñת»»ÎªºÚ°×¶þֵͼ£¨ÏñËØÖµÔÚ[min, max]Çø¼äÍâΪºÚÉ«£¬Çø¼äÄÚΪ°×É«£©
·½·¨Ç©Ãû void opencv.threshold (Mat src, Int32 min, Int32 max)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ý¶þÖµ»¯µÄÔʼͼÏñ£¨Mat¶ÔÏó£©
- Int32 min£º¶þÖµ»¯×îСãÐÖµ£¨0-255£©
- Int32 max£º¶þÖµ»¯×î´óãÐÖµ£¨0-255£©
*/
// ʾÀý£º½ØÆÁ²¢½øÐжþÖµ»¯´¦Àí£¨º¬ºóÐøÁ÷³Ì£©
function thresholdExample() {
    printl("=== threshold ·½·¨Ê¾Àý ===");
    try {
        // ½ØÍ¼»ñȡͼÏñ
        const binImg = screen.screenShotFull();
        const binMat = binImg.getMat();
        
        // ½øÐжþÖµ»¯´¦Àí£¬ãÐÖµÇø¼ä50-200
        opencv.threshold(binMat, 50, 200);
        printl("ͼÏñÒѶþÖµ»¯´¦Àí");
        
        // תImage²¢OCRʶ±ð
        const binImg2 = new Image();
        binImg2.readMat(binMat);
        var ocr2 = binImg2.ocr(0, 0, 1, 1);
        if(ocr2!=null){
           printl(ocr2.getAllString());
        } else {
           printl("¶þÖµ»¯ºóOCRʶ±ðʧ°Ü");
        }
        
        // ±£´æ´¦ÀíºóµÄͼÏñ£¨¿ÉÑ¡£©
        // binImg.save("/sdcard/binary_image.png");
        
        // ÊÍ·ÅÄÚ´æ
        binMat.close();
        binImg.close();
        binImg2.close();
    } catch (error) {
        printl("thresholdÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
// thresholdExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// µÚ°Ë¸ö·½·¨£º📌invertColor - ͼÏñÑÕÉ«·×ª£¨·´É«´¦Àí£©
/*
Àà±ð ÏêÇé˵Ã÷
·½·¨¹¦ÄÜ ¶ÔͼÏñ½øÐÐÑÕÉ«·×ª£¬½«Ã¿¸öÏñËØµÄRGBÖµ·´×ª£¨Èç°×É«¡úºÚÉ«¡¢ºìÉ«¡úÇàÉ«µÈ£©
·½·¨Ç©Ãû void opencv.invertColor (Mat src)
·µ»ØÖµ void£¨ÎÞ·µ»ØÖµ£¬Ö±½ÓÐÞ¸ÄÊäÈëµÄMat¶ÔÏó£©
²ÎÊý - Mat src£º´ýÑÕÉ«·×ªµÄÔʼͼÏñ£¨Mat¶ÔÏó£©
*/
// ʾÀý£º·×ªÍ¼ÏñÑÕÉ«
function invertColorExample() {
    printl("=== invertColor ·½·¨Ê¾Àý ===");
    try {
        // ½ØÍ¼»ñȡͼÏñ
        const invertImage = screen.screenShotFull();
        const invertMat = invertImage.getMat();
        
        // ·×ªÍ¼ÏñÑÕÉ«
        opencv.invertColor(invertMat);
        printl("ÑÕÉ«ÒѷתµÄͼÏñ");
        
        // ±£´æ´¦ÀíºóµÄͼÏñ£¨¿ÉÑ¡£©
        // invertImage.save("/sdcard/inverted_image.png");
        
        // ÊÍ·Å×ÊÔ´
        invertMat.close();
        invertImage.close();
    } catch (error) {
        printl("invertColorÖ´Ðгö´í: " + error.message);
    }
}
// µ÷ÓÃʾÀý
// invertColorExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// ========================== ʵ¼Ê¿ÉÓõÄÍêÕûʾÀý ==========================
/**
 * ʵ¼Ê¿ÉÓõÄOpenCVͼÏñ´¦ÀíʾÀý
 * ÑÝʾÍêÕûµÄͼÏñ´¦ÀíÁ÷³Ì
 */
async function practicalOpenCVExample() {
    printl("=== OpenCVÍêÕû´¦ÀíÁ÷³ÌʾÀý ===");
    
    try {
        // 1. È«ÆÁ½ØÍ¼
        printl("1. Ö´ÐÐÈ«ÆÁ½ØÍ¼");
        const screenshot = screen.screenShotFull();
        const mat = screenshot.getMat();
        printl("   ½ØÍ¼Íê³É£¬Í¼Ïñ³ß´ç: " + mat.width + "x" + mat.height);
        
        // 2. ͼÏñÔ¤´¦Àí - תΪ»Ò¶Èͼ
        printl("2. ͼÏñתΪ»Ò¶Èͼ");
        opencv.toGray(mat);
        
        // 3. ʹÓÃcvÎļþ²éÕÒͼÏñ
        printl("3. ʹÓÃcvÎļþ²éÕÒͼÏñ");
        const findResults = opencv.findImagesEx("ͼɫ961575.cv");
        if (findResults && findResults.length > 0) {
            printl("   ÕÒµ½ " + findResults.length + " ¸öÆ¥ÅäÄ¿±ê");
            const firstResult = findResults[0];
            printl("   µÚÒ»¸öÆ¥ÅäÄ¿±êÏàËÆ¶È: " + firstResult.score());
            printl("   Î»ÖÃÐÅÏ¢: " + firstResult.getRect().toString());
        } else {
            printl("   Î´ÕÒµ½Æ¥ÅäÄ¿±ê");
        }
        
        // 4. ʹÓÃcvÎļþ½øÐÐOCRʶ±ð
        printl("4. ʹÓÃcvÎļþ½øÐÐOCRʶ±ð");
        var ocrResult=opencv.OCREx('ͼɫ995593.cv');
        if(ocrResult!=null){
           printl(ocrResult.getAllString());
        } else {
           printl("OCRʶ±ðʧ°Ü»òδʶ±ðµ½ÎÄ×Ö");
        }
        
        // 5. ͼÏñ¶þÖµ»¯´¦Àí
        printl("5. ͼÏñ¶þÖµ»¯´¦Àí");
        opencv.threshold(mat, 100, 200);
        printl("   ¶þÖµ»¯´¦ÀíÍê³É");
        
        // 6. ÑÕÉ«·×ª
        printl("6. ͼÏñÑÕÉ«·×ª");
        opencv.invertColor(mat);
        printl("   ÑÕÉ«·×ªÍê³É");
        
        // 7. ²ÃÇÐͼÏñ
        printl("7. ²ÃÇÐͼÏñÖмäÇøÓò");
        opencv.extractRegion(mat, [0.25, 0.25, 0.5, 0.5], true);
        printl("   Í¼Ïñ²ÃÇÐÍê³É");
        
        // ÊÍ·Å×ÊÔ´
        mat.close();
        screenshot.close();
        printl("8. ×ÊÔ´ÊÍ·ÅÍê³É");
        
    } catch (error) {
        printl("Ö´Ðйý³ÌÖз¢Éú´íÎó: " + error.message);
    }
    
    printl("=== OpenCVͼÏñ´¦ÀíʾÀý½áÊø ===");
}
// ÔËÐÐʵ¼ÊʾÀý
 practicalOpenCVExample(); // È¡Ïû×¢ÊÍÒÔÔËÐÐʾÀý
// ... existing code ...
 
 
 | 
 |