openCV 3 c++ cli

0

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 !

0

Niby sprawa prosta ale nic mi nie dziala

Jedyne co pokazałeś to obrazek z czterema tajemniczymi liczbami.
Pokaż kod!

0

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";
			
0
                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.

0

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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1