Witam. Mam powazny problem ze znalezienie tekstu na ekranie. Robie screenshota z ktorego nastepnie chcialbym odczytac tekst. Niby sprawa prosta ale nic mi nie dziala. Probuje z openCV 3.1 ale nie moge nic konkretnego znaleŹĆ co by mi pomoglo. Poza tym czy jest jakis szybki i normalny sposob na uzywanie matryc z obrazami z openCV w okienkach C++ cli? Samo przetworzenie obrazu przez openCV zajmuje 20ms natomiast przerobienie tego i wyswietlenie w pictureBoxie zajmuje cale wieki!!! Jakies pomysly jak wpisywac do Mat obraz przechwycony z ekranu? Uprzedzam ze przeszukalem neta i znalazlem mase materialu ale konkretnie nic co moglbym uzyc! W zalaczniku przykladowe cyfry do znalezienia i rozpoznania na ekranie. Help !
Niby sprawa prosta ale nic mi nie dziala
Jedyne co pokazałeś to obrazek z czterema tajemniczymi liczbami.
Pokaż kod!
Odnosnie zamiany obrazu z matrycy Mat openCV na bmp switch-e zastosowalem tutaj do zamiany kolorow w ramach testow.
Mozna pominac wszystko z petli i zastosowac tylko Vec3b bgrPixel = imgCopy.at<Vec3b>(i, j);Color p = bmp->GetPixel(j, i); ale nadal zamiana zajmuje wieki...
czas_start2 = DateTime::Now;
uint8_t* pixelPtr = (uint8_t*)imgCopy.data;
int cn = imgCopy.channels();
cv::Scalar_<uint8_t> bgrPixel;
for (int i = 0; i < imgCopy.rows; i++)
{
for (int j = 0; j < imgCopy.cols; j++)
{
//Vec3b bgrPixel = imgCopy.at<Vec3b>(i, j);
//Color p = bmp->GetPixel(j, i);
//int a = p.A;
bgrPixel.val[0] = pixelPtr[i*imgCopy.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*imgCopy.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*imgCopy.cols*cn + j*cn + 2]; // R
switch (colorR)
{
case 1: R = bgrPixel.val[2];
break;
case 2: R = bgrPixel.val[1];
break;
case 3: R = bgrPixel.val[0];
break;
case 4: R = 0;
break;
case 5: R = 255;
break;
default: R = bgrPixel.val[2];
break;
}
switch (colorG)
{
case 1: G = bgrPixel.val[2];
break;
case 2: G = bgrPixel.val[1];
break;
case 3: G = bgrPixel.val[0];
break;
case 4: G = 0;
break;
case 5: G = 255;
break;
default: G = bgrPixel.val[1];
break;
}
switch (colorB)
{
case 1: B = bgrPixel.val[2];
break;
case 2: B = bgrPixel.val[1];
break;
case 3: B = bgrPixel.val[0];
break;
case 4: B = 0;
break;
case 5: B = 255;
break;
default: B = bgrPixel.val[0];
break;
}
bmp->SetPixel(j, i, Color::FromArgb( R, G, B));
// bmp->SetPixel(j, i, Color::FromArgb(bgrPixel.val[2], bgrPixel.val[1], bgrPixel.val[0]));
}
}
pictureBox2->Image = bmp;
TimeSpan^ czas_dzial2 = gcnew TimeSpan();
czas_dzial2 = DateTime::Now - czas_start2;
label6->Text = "Przetworzenie obrazu z Mat do pictureBoxa zajelo: " + czas_dzial2->Seconds.ToString() + " sekund " + czas_dzial2->Milliseconds.ToString() + " milisekund";
bmp->SetPixel(j, i, Color::FromArgb( R, G, B));
SetPixel jest mega powolne. Za pomocą Bitmap.LockBits
pobierzesz wskaźnik do bitmapy, po której będziesz mógł wydajnie pisać do woli.
Dzieki. Juz cos nowego do przetestowania! Przy okazji takie pytanie: Jaki format pliku stosowac przy zapisie screenshota aby bylo jak najszybciej i jak najdokladniej. W tej chwili stosuje .png . Ewentualnie czy szybciej bylo by robic screenshota za pomoca openCV?? A jesli tak to w jaki sposob? Wiem jak przechwycic obraz z kamery czy z pliku otworzyc ale jak z pulpitu?