blackfxx
-
Количество публикаций
8 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем blackfxx
-
-
вот об этом подумал только после того, как написал ответ. Фиг знает
-
проблема скорее всего в memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
сдесь ты копируешь биты изображения(BITMAP) bmp.bmBits в imageData. Чтобы их получить тебе надо использовать DC(дескриптор контекста устройства)
HDC DC; DC = GetDC(0); //Заполняем массив битов изображения int i = GetDIBits( DC, // дескриптор контекста устройства HBM, // дескриптор изображения 0, // первая выбираемая линия для изображения назначения BIP->bmiHeader.biHeight, // количество выбираемых линий bmp.bmBits, // адрес массива битов изображения (BITMAPINFO*)&BIP->bmiHeader,// адрес структуры с данными изображения DIB_RGB_COLORS // RGB или индекс палитры );
Наверное будет работать) Сам все пробовал методом тыка и интуицией
-
IplImage * GetIplImage(HBITMAP HBM) { BITMAP BM; LPBITMAPINFO BIP; HDC DC; DWORD DataSize; WORD BitCount; GetObject(HBM, sizeof(BITMAP), (LPSTR)&BM); BitCount = (WORD)BM.bmPlanes * BM.bmBitsPixel; DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight; BIP=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFOHEADER)); BIP->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); BIP->bmiHeader.biWidth = BM.bmWidth; BIP->bmiHeader.biHeight = BM.bmHeight; BIP->bmiHeader.biPlanes = 1; BIP->bmiHeader.biBitCount = BitCount; BIP->bmiHeader.biCompression = 0; BIP->bmiHeader.biSizeImage = DataSize; BIP->bmiHeader.biXPelsPerMeter = 0; BIP->bmiHeader.biYPelsPerMeter = 0; if (BitCount < 16) BIP->bmiHeader.biClrUsed = (1<<BitCount); BIP->bmiHeader.biClrImportant = 0; DC = GetDC(0); BYTE * bits; // массив для битов изображения long imgsize, pixels; // Различные размерности для записи файла pixels = BIP->bmiHeader.biWidth * BIP->bmiHeader.biHeight; switch(BIP->bmiHeader.biBitCount) { case 4: imgsize = pixels / 2; break; case 8: imgsize = pixels; break; case 16: imgsize = pixels * 2; break; case 24: imgsize = pixels * 3; break; case 32: imgsize = pixels * 4; break; default: break; } // выделяем память под биты изображения bits = (unsigned char*)GlobalAlloc(GMEM_FIXED,imgsize); //Заполняем массив битов изображения int i = GetDIBits( DC, // дескриптор контекста устройства HBM, // дескриптор изображения 0, // первая выбираемая линия для изображения назначения BIP->bmiHeader.biHeight, // количество выбираемых линий bits, // адрес массива битов изображения (BITMAPINFO*)&BIP->bmiHeader,// адрес структуры с данными изображения DIB_RGB_COLORS // RGB или индекс палитры ); // заполняем данные по изображению int nChannels = BM.bmBitsPixel == 1 ? 1 : BM.bmBitsPixel/8 ; int depth = BM.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U; IplImage* img = cvCreateImageHeader(cvSize(BM.bmWidth, BM.bmHeight), depth, nChannels); // выделяем память под биты img->imageData = (char*) malloc( BM.bmHeight * BM.bmWidth* nChannels * sizeof(char)); // копируем биты memcpy( img->imageData, (char*)(bits), BM.bmHeight * BM.bmWidth * nChannels); // изображение получается перевернутым IplImage * imgModified = cvCreateImage(cvSize(img->width,img->height),img->depth, 3); cvCvtColor(img, imgModified, CV_BGRA2BGR); // в img используеются 4 канала, мне необходимо только три IplImage * imgMirror = cvCreateImage(cvSize(img->width,img->height),img->depth, 3); cvMirror(imgModified, imgMirror); // приводим в нормальный вид // убираем мусор cvReleaseImage(&imgModified); free( img->imageData); cvReleaseImage(&img); ReleaseDC(0, DC); GlobalFree((HGLOBAL)bits); HeapFree(GetProcessHeap(),0,(LPVOID)BIP); return (imgMirror); }
-
Необходима функция для перевода HBITMAP to IplImage*. А то в данный момент я делаю скриншот экрана, получаю его в HBITMAP'e и сохраняю на диск а потом гружу cvLoadImage. Вприницпе не очень устраивает. Хотелось сразу в IplImage.
смотрел топик http://www.compvision.ru/forum/index.php?showtopic=280
Сам тоже находил в инете вот эту функцию.
IplImage* hBitmap2Ipl(HBITMAP hBmp) { BITMAP bmp; ::GetObject(hBmp,sizeof(BITMAP),&bmp); int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ; int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U; IplImage* img = cvCreateImageHeader( cvSize(bmp.bmWidth, bmp.bmHeight) , depth, nChannels ); img->imageData = (char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char)); memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels); return img; }
Но она прерывается на строчке
memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
Unhandled exception at 0x576fbe20 (msvcr100d.dll) in testApp.exe: 0xC0000005: Access violation reading location 0x00000000.
Может кто сталкивался? или есть идеи что изменить?
UPD> проблему решил. Это оказался только кусок процедуры. Пришлось хорошо поломать голову.
-
tesseract неплох, это правда. еще понравились реализации подобных проблем с использованием нейронных сетей. обучается, правда, долго, но результат - как раз под описание проблемыЕсли не сложно, не могли бы дать ссылку на пример с использованием нейронных сетей?
-
Спасибо всем за предложенные советы.
Попробовал tesseract - взял с GoogleCode библиотеку, стандартную дату для распознавания английского текста, попробовал.
На шрифтах размера больше 14го работает замечательно. Но в моем случае шрифт приблизительно 8-9. Его в упор не видит. Пробовал увеличивать изображение 2-3 раза и распознавать - обнаруживает, что есть текст, но выдает полную кашу.
Попробовал MODI(Microsoft Office Document Imaging). Распознает мелкий текст нормально - цифры без ошибок, а вот сочетания букв fd fl коряво.
Буду пробовать другие библиотеки.
-
Необходимо распознать текст на однотонном фоне (шрифт стандартный, например, Times New Roman) с определенной области изображения.
За счет каких функций, решений это можно осуществить?
Заранее спасибо.
HBITMAP to IplImage*
в OpenCV
Опубликовано · Report reply
Не знаю, по этому поводу не заморачивался.
Память может утекать вот здесь:
>>cvCreateData(img);
наверняка надо использовать cvReleaseData(&img) помимо cvRelease(&img) при завершении работы с изображением. у меня во всяком случае было
img->imageData = (char*) malloc( BM.bmHeight * BM.bmWidth* nChannels * sizeof(char));
free( img->imageData);
Возможно тут:
>>HBITMAP hbm = Image2->Picture->Bitmap->Handle;
Я использую след функции для создания и удаления хбитмапа
HBITMAP bm = CreateBitmap(..);
DeleteObject(bm);