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

blackfxx

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

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

  • Посещение

Сообщения, опубликованные пользователем blackfxx


  1. и еще а есть функция чтобы наоборот IplImage -> Hbitmap.. ??

    Не знаю, по этому поводу не заморачивался.

    Память может утекать вот здесь:

    >>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. проблема скорее всего в 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 или индекс палитры 
    
    );

    Наверное будет работать) Сам все пробовал методом тыка и интуицией


  3. 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);		
    
    }


  4. Необходима функция для перевода 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> проблему решил. Это оказался только кусок процедуры. Пришлось хорошо поломать голову.


  5. tesseract неплох, это правда. еще понравились реализации подобных проблем с использованием нейронных сетей. обучается, правда, долго, но результат - как раз под описание проблемы

    Если не сложно, не могли бы дать ссылку на пример с использованием нейронных сетей?


  6. Спасибо всем за предложенные советы.

    Попробовал tesseract - взял с GoogleCode библиотеку, стандартную дату для распознавания английского текста, попробовал.

    На шрифтах размера больше 14го работает замечательно. Но в моем случае шрифт приблизительно 8-9. Его в упор не видит. Пробовал увеличивать изображение 2-3 раза и распознавать - обнаруживает, что есть текст, но выдает полную кашу.

    Попробовал MODI(Microsoft Office Document Imaging). Распознает мелкий текст нормально - цифры без ошибок, а вот сочетания букв fd fl коряво.

    Буду пробовать другие библиотеки.


  7. Необходимо распознать текст на однотонном фоне (шрифт стандартный, например, Times New Roman) с определенной области изображения.

    За счет каких функций, решений это можно осуществить?

    Заранее спасибо.

×