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

преобразовать загружаемую картинку к требуемому разрешению?

Recommended Posts

а как преобразовать любую загружаемую картинку в opencv к разрешению допустим 640Х480?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

// В пример для загрузки изображения вставить.

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 );

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

что то ругается программа. в какое место вставлять в программе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня такое компилируется.

//---------------------------------------------------------------------------
#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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

как вывести полученный кадр с камеры?

вот так получен

IplImage* pFrame=cvQueryFrame(pCapture)

а что с ним дальше делать

функция cvShowImage не работает с IplImage

и еще как создать окно (?cvNamedWindow) внутри другого (своего) окна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
как вывести полученный кадр с камеры?

вот так получен

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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вобщем такой вопрос :

Как отмаштабировать изоброжение в OpenCV???

Например у меня есть изоброжение с размером 640x480 и нужно получить изоброжение с другим масштабом ?????

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Вобщем такой вопрос :

Как отмаштабировать изоброжение в OpenCV???

Например у меня есть изоброжение с размером 640x480 и нужно получить изоброжение с другим масштабом ?????

Можно так:

// Выделяем память под копию кадра
if( !frame_copy ) { frame_copy = cvCreateImage( cvSize(352,288),IPL_DEPTH_8U, frame->nChannels );}
// Масштабируем под заданный размер
cvResize( frame, frame_copy, CV_INTER_LINEAR );[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×