Jump to content
Compvision.ru
Sign in to follow this  
ak-86

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

IplImage* pFrame=cvQueryFrame(pCapture)

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

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

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

Share this post


Link to post
Share on other sites
как вывести полученный кадр с камеры?

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

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]

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Вобщем такой вопрос :

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

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

Можно так:

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×