ak-86 0 Жалоба Опубликовано May 13, 2009 а как преобразовать любую загружаемую картинку в opencv к разрешению допустим 640Х480? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 13, 2009 // В пример для загрузки изображения вставить. IplImage* resize; // Создаем изображение нужного размера resize = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1 /*3 - если цветное*/); // Масштабирование изображения - исходное изображение находится в gray cvResize( gray, resize, CV_INTER_LINEAR ); // вместо CV_LINEAR возможны другие типы интерполяции: // CV_INTER_NN - nearest-neigbor interpolation (ближайший сосед ?) // CV_INTER_LINEAR - bilinear interpolation (билинейная - используется по умолчанию) // CV_INTER_AREA - resampling using pixel area relation. It is preferred method for image decimation that gives moire-free results. In case of zooming it is similar to CV_INTER_NN method. Масштабирование с учетом отношения пиксельных площадей. Наиболее предпочтительный метод, т.к. дает изображение без муара. Результат напоминает результат метода CV_INTER_NN. // CV_INTER_CUBIC - bicubic interpolation. Бикубичестая интерполяция. // Вывод или другое использование // Очистка cvReleaseImage( &resize ); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ak-86 0 Жалоба Опубликовано May 13, 2009 что то ругается программа. в какое место вставлять в программе? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 13, 2009 У меня такое компилируется. //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "cv.h" #include "highgui.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; IplImage* img; void ProcessFrame( IplImage* img ); #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; LPBITMAPINFO lpbi = new BITMAPINFO; lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biWidth = _Grab->width; lpbi->bmiHeader.biHeight =_Grab->height; lpbi->bmiHeader.biPlanes = 1; lpbi->bmiHeader.biBitCount = 24; lpbi->bmiHeader.biCompression = BI_RGB; lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height; lpbi->bmiHeader.biXPelsPerMeter = 0; lpbi->bmiHeader.biYPelsPerMeter = 0; lpbi->bmiHeader.biClrUsed = 0; lpbi->bmiHeader.biClrImportant = 0; void* pBits; HBITMAP hBitmap = CreateDIBSection( NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0 ); delete lpbi; if ( hBitmap ) App=(char*)pBits; long int length=0; if(_Grab->nChannels==1) // Серое или бинарное { length = _Grab->width*(_Grab->height); for (int i=0;i<_Grab->height;i++) { for (int j=0;j<_Grab->width;j++) { App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j]; } } } if(_Grab->nChannels==3) // Цветное { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3); // Копируем память } } return hBitmap; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Функция вывода изображения на HANDLE оконного компонента //--------------------------------------------------------------------------- void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE) { HDC hMemDC,hDC; hDC=GetDC(HANDLE); hMemDC = CreateCompatibleDC(hDC); HBITMAP Bitmap=CreateRGBBitmap(_Grab); SelectObject(hMemDC,Bitmap); BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY); DeleteObject(Bitmap); DeleteDC(hMemDC); DeleteDC(hDC); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { APIDrawIpl(100,100,img,Form1->Handle); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { IplImage* gray; img = cvLoadImage("OpenCv.jpg"); gray = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1); cvCvtColor(img, gray, CV_BGR2GRAY); // Получаем серый цвет //**************************************************** IplImage* resize; resize = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1 /*3 - если цветное*/); // Масштабирование изображения cvResize( gray, resize, CV_INTER_LINEAR ); //**************************************************** ProcessFrame(resize); cvReleaseImage( &img ); cvReleaseImage( &gray ); cvReleaseImage( &resize ); } //---------------------------------------------------------------------------[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
megapup 0 Жалоба Опубликовано May 20, 2009 как вывести полученный кадр с камеры? вот так получен IplImage* pFrame=cvQueryFrame(pCapture) а что с ним дальше делать функция cvShowImage не работает с IplImage и еще как создать окно (?cvNamedWindow) внутри другого (своего) окна? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 20, 2009 как вывести полученный кадр с камеры? вот так получен IplImage* pFrame=cvQueryFrame(pCapture) а что с ним дальше делать функция cvShowImage не работает с IplImage и еще как создать окно (?cvNamedWindow) внутри другого (своего) окна? Вот это работает в C++Builder6. Архив с проектом: simple2.rar //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "cv.h" #include "highgui.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; void ProcessFrame( IplImage* image ); // Описатель шрифта (см. дальше) CvFont font; #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; LPBITMAPINFO lpbi = new BITMAPINFO; lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biWidth = _Grab->width; lpbi->bmiHeader.biHeight =_Grab->height; lpbi->bmiHeader.biPlanes = 1; lpbi->bmiHeader.biBitCount = 24; lpbi->bmiHeader.biCompression = BI_RGB; lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height; lpbi->bmiHeader.biXPelsPerMeter = 0; lpbi->bmiHeader.biYPelsPerMeter = 0; lpbi->bmiHeader.biClrUsed = 0; lpbi->bmiHeader.biClrImportant = 0; void* pBits; HBITMAP hBitmap = CreateDIBSection( NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0 ); delete lpbi; if ( hBitmap ) App=(char*)pBits; long int length=0; if(_Grab->nChannels==1) // Серое или бинарное { length = _Grab->width*(_Grab->height); for (int i=0;i<_Grab->height;i++) { for (int j=0;j<_Grab->width;j++) { App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j]; } } } if(_Grab->nChannels==3) // Цветное { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3); // Копируем память } } return hBitmap; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Функция вывода изображения на HANDLE оконного компонента //--------------------------------------------------------------------------- void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE) { HDC hMemDC,hDC; hDC=GetDC(HANDLE); hMemDC = CreateCompatibleDC(hDC); HBITMAP Bitmap=CreateRGBBitmap(_Grab); SelectObject(hMemDC,Bitmap); BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY); DeleteObject(Bitmap); DeleteDC(hMemDC); DeleteDC(hDC); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { capture = cvCaptureFromCAM(0); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); Application->OnIdle = IdleLoop; // Поток обработки простоя cvNamedWindow( "Window", 0 ); // Здесь создаем окно cvNamedWindow } //--------------------------------------------------------------------------- void __fastcall TForm1::IdleLoop(TObject*, bool& done) { done = false;// Поток обработки простоя if( capture ) { if( !cvGrabFrame( capture )) goto skip; frame = cvRetrieveFrame( capture ); if( !frame ) goto skip; //********************************************************* // Если стерли то что ниже - это надо раскомментировать // if( !frame_copy ) // frame_copy = cvCreateImage( cvSize(frame->width,frame->height), // IPL_DEPTH_8U, frame->nChannels ); // Делаем копию кадра, иначе может пропасть. // cvCopy( frame, frame_copy, 0 ); // Если стерли то что ниже - это надо раскомментировать //********************************************************* //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,280), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* cvShowImage( "Window", frame_copy ); // Здесь выводим в него IplImage ProcessFrame( frame_copy ); } skip:; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { cvDestroyWindow( "Window" ); // Здесь его уничтожаем cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { APIDrawIpl(10,10,img,Form1->Handle); }[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
megapup 0 Жалоба Опубликовано May 20, 2009 спасибо! с этим разобрался Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Frimen 0 Жалоба Опубликовано August 24, 2009 Вобщем такой вопрос : Как отмаштабировать изоброжение в OpenCV??? Например у меня есть изоброжение с размером 640x480 и нужно получить изоброжение с другим масштабом ????? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 24, 2009 Вобщем такой вопрос : Как отмаштабировать изоброжение в OpenCV??? Например у меня есть изоброжение с размером 640x480 и нужно получить изоброжение с другим масштабом ????? Можно так: // Выделяем память под копию кадра if( !frame_copy ) { frame_copy = cvCreateImage( cvSize(352,288),IPL_DEPTH_8U, frame->nChannels );} // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR );[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах