Перейти к содержимому
Compvision.ru

blackfxx

Пользователи
  • Количество публикаций

    8
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О blackfxx

  • Звание
    Новичок
  1. HBITMAP to IplImage*

    Не знаю, по этому поводу не заморачивался. Память может утекать вот здесь: >>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);
  2. HBITMAP to IplImage*

    вот об этом подумал только после того, как написал ответ. Фиг знает
  3. HBITMAP to IplImage*

    проблема скорее всего в 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 или индекс палитры ); Наверное будет работать) Сам все пробовал методом тыка и интуицией
  4. HBITMAP to IplImage*

    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); }
  5. HBITMAP to IplImage*

    Необходима функция для перевода 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> проблему решил. Это оказался только кусок процедуры. Пришлось хорошо поломать голову.
  6. Если не сложно, не могли бы дать ссылку на пример с использованием нейронных сетей?
  7. Спасибо всем за предложенные советы. Попробовал tesseract - взял с GoogleCode библиотеку, стандартную дату для распознавания английского текста, попробовал. На шрифтах размера больше 14го работает замечательно. Но в моем случае шрифт приблизительно 8-9. Его в упор не видит. Пробовал увеличивать изображение 2-3 раза и распознавать - обнаруживает, что есть текст, но выдает полную кашу. Попробовал MODI(Microsoft Office Document Imaging). Распознает мелкий текст нормально - цифры без ошибок, а вот сочетания букв fd fl коряво. Буду пробовать другие библиотеки.
  8. Необходимо распознать текст на однотонном фоне (шрифт стандартный, например, Times New Roman) с определенной области изображения. За счет каких функций, решений это можно осуществить? Заранее спасибо.
×