Helló
2 feladatot szeretnék megoldani vmben futó Debian Linuxon, parancssorból Php alól kezelve és abból feldolgozva az eredményeket, amiket visszadnának:
A: az adott 24 bites BMP kép, amit vnc használattal mentek le most épp bmp formátumban, kivágom azt a részt, ahol van a szöveg, majd azt szöveggé alakítsam hatékonyan. Általában számok vannak a kivágott kis képen, 3 helyi-értékenként szóköz, példa: 1 000 000. Ez mondjuk egy 300x150 pixeles kép. Később 1-1 angol nyelvű mondatot alakítanék szöveggé.
B: Biztosan detektálni egy lementett nyomógombot, hogy a képernyőn van-e. A nyomógombot is 24 bites bmp formátumban tárolom, például 80x40 pixel (lekerekítés nincs lementve, csak az egyértelmű szöveg), a képernyő mérete pedig 1024x768 pixel.
Amit eddig próbáltam: opencv.
Ez lett a nem tökéletes megoldás, webes keresés és Chatpt által összehozva, hogy nem tudok ezen a nyelven programozni, a cpp forrása:
#include </opt/opencv/include/opencv2/opencv.hpp>
int main(int argc, char** argv) {
if (argc < 3) {
std::cerr << "Usage: " << argv[0] << " <main_image_path> <small_image_path>" << std::endl;
return 1;
}
cv::Mat mainImage = cv::imread(argv[1], cv::IMREAD_GRAYSCALE);
cv::Mat smallImage = cv::imread(argv[2], cv::IMREAD_GRAYSCALE);
if (mainImage.empty() || smallImage.empty()) {
std::cerr << "!" << std::endl;
return 1;
}
cv::Mat result;
cv::matchTemplate(mainImage, smallImage, result, cv::TM_CCOEFF);
double minVal, maxVal;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
std::cout << "" << maxLoc.x << "," << maxLoc.y << "" << std::endl;
return 0;
}
És ez van meg 6 változatban, ahol cserélgetve van ez, minden más azonos:
ccoeff (cv::TM_CCOEFF)
ccoeff_normed (cv::TM_CCOEFF_NORMED)
ccorr (cv::TM_CCORR)
ccorr_normed (cv::TM_CCORR_NORMED)
sqdiff(cv::TM_SQDIFF)
sqdiff normed (cv::TM_SQDIFF_NORMED)
Ezeknek a lefordított binárisát próbálgattam Php alól, de a ccoeff_normed működik a legjobban. Elolvastam amikor ezt készítettem 1 éve, de már nem vagyok képben, mert nem úgy működött, amit vártam. Nem tudtam megoldani, hogy megbízható legyen.
Mármint sokszor megtalálja a B esetén a gombot, de néha téveszt, ha több helyen van a képernyőn, akkor random sorrendben adja vissza. Ha kicsit más a gomb, más színű vagy bármi, akkor is visszaadja a pozíciót, amikor hasonló van a képen.
A nyomógomb úgy van körbevágva, hogy csak a szöveg része, a lekerekítés nincs lementve. Ami le van mentve az többször vagy egyszer sincs a képen, de nem megbízhatóan működik, hogy visszaadja a pozíciót. Sok a fals érték.
Arra keresek megoldást, hogy szinte pixel pontosan visszaadja az x és y pixel koordinátát, hogy hol a képernyőn az adott gomb. Ha nincs a képernyőn, akkor -1,-1 pozíciót adjon vissza, vagy mást.
Ez kb 0,1 sec, a sebességével nagyon elégedett vagyok. Ha Php nyelvből akarnék hasonlót, az több másodperc, és az sem volt tökéletes.
Ideális lenne egy külső program, aminek megadom a lementett képernyőt bmp formátumban, és a keresendő képet bmp formátumban. Ha nincs rajta, -1,-1 a visszatérési értéke vagy lementi fileba amit megadok, ha 1 esetben van a képen amit keresek, visszaadja hol, pixelben x,y: 300x245. Ha többször van rajta, visszaadja a többi pozíciót, 300x245 600x400 700x500.
Jó lenne olyan kapcsoló itt még, ha picit más árnyalatú lesz a gomb, de azonos a szöveg, azt még elfogadja, de nyilván más szövegű gombot ne találjon meg. Na ez sem sikerült eddig.
Másik:
Az A esetén, amikor képből kellene szöveg, főleg szám, ezt próbáltam:
tesseract input.bmp a.txt -l eng -c tessedit_char_whitelist=0123456789 digits
Az input.bmp már eleve egy kivágott kis kép, amin csak egyértelműen, jól olvashatóan ott a szám. Hát, nem tudja átalakítani betűkké így sem.
Tudnátok más parancssorból, hasonlóan hívható ilyen funkciót, ami jól működik és nem nagyon lassú?
Amiket a kereső vagy a Chatgpt visszaadott programokat, azokkal egyikkel sem tudtam megoldani, hogy jó legyen sem az A sem a B, pedig kb az összes ingyenest kipróbáltam, felraktam. Ezért írok, hogy ezeken már túl vagyok.
Köszi a segítséget.
Hozzászólások
Nem lehet, hogy valami obskúrus fonttal van megoldva a szöveg/szám? Én most egy standard JIRA-ról PNG formátumban lementett printscreen-nel teszteltem, és mind a szöveget, mind a számokat rendben felismerte. A szövegnél annyi tévesztése volt, hogy itt-ott a kis és nagy betűket felcserélte, illetve a kötőjelet egy esetben nem ismerte fel)
A képet úgy készítettem, hogy egy JIRA-s ticket listázóból csak a ticket id-kat jelöltem ki a mate-screenshot -tal, lementettem a képet, majd a parancsot megfuttattam egyszer a "-c tessedit_char_whitelist=0123456789 digits" rész nélkül (ekkor kaptam meg a teljes listát), egyszer pedig a fenti kapcsolókkal kiegészítve.
Nem akarok bunkó lenni, de lehet, hogy látni kellene a képekről egy példát.
Szerk: kipróbáltam a fenti kódod printscreenjével is, rengeteget hibázik. Lehet betűméret para is, fontpara is... tényleg érdemes lenne látni, mi a kiinduló képed, hány pontos betűkkel vannak a cuccok például, mert az, hogy "van rajta egy szöveg számokkal" meg "van rajta egy gomb" az kicsit kevésnek tűnik a hiba feltárásához.
Blog | @hron84
via @snq-
Megnyugtató, hogy nem csak nekem nem jó. Lehet másképpen kellene meghívni. Lehet van erre jobb megoldás, csak még nem találtam meg.
Nem vagy bunkó, keresek és megosztok, hogy lásd a példát.
Igen, kicsi betűről van szó.
Lehet ágyúval verébre, de egy okos upscale biztos sokat segítene az azonosításban.