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.
- 233 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni