Бикубическая интерполяция с использованием openCV - PullRequest
0 голосов
/ 08 марта 2012

Я хочу выполнить изменение размера изображения с помощью бикубической интерполяции.Тем не менее, мое выходное изображение new_img выглядит точно так же, как и исходное загруженное изображение, img.Кроме того, когда я нашел ширину и высоту new_img, он имеет те же размеры, что и мое исходное изображение.Я думал, что изображение назначения должно было быть изменено?Это мой кодКто-нибудь посмотрит, если я что-то сделал неточно, пожалуйста?Заранее спасибо.

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {
IplImage* img = NULL;
const int maxScale = 1;
img = cvLoadImage("C:\\walk mii.jpg");
if (!img){return -1;}
for(int s = 1; s <= maxScale; s++)
{
    IplImage* new_img = img;
    if( s > 1 ) {
        new_img = cvCreateImage(cvSize(img->width*s,img->height*s), img->depth, img->nChannels );
        cvResize( img, new_img, CV_INTER_CUBIC );}
    cvNamedWindow( "original", CV_WINDOW_AUTOSIZE );
    cvShowImage( "original", img);
    cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
    cvShowImage( "result", new_img);

    CvSize dim = cvGetSize(new_img);
        cout <<" dimensions:: height:" <<  dim.height<<" width:"<< dim.width<< endl;

    cvWaitKey(0);
    cvReleaseImage( &img );
    cvReleaseImage( &new_img );
    cvDestroyWindow( "result" );
    return 0;
    }
}

Измененный код:

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {
IplImage* img = NULL;
IplImage* new_img = NULL;
img = cvLoadImage("C:\\walk mii.jpg");
if (!img){
    return -1;}
new_img = cvCreateImage(cvSize(img->width,img->height), img->depth, img->nChannels );
cvResize( img, new_img, CV_INTER_CUBIC );
cvNamedWindow( "original", CV_WINDOW_AUTOSIZE );
cvShowImage( "original", img);
cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
cvShowImage( "result", new_img);

CvSize dim = cvGetSize(new_img);
cout <<" dimensions:: height:" <<  dim.height<<" width:"<< dim.width<< endl;

cvWaitKey(0);
cvReleaseImage( &img );
cvReleaseImage( &new_img );
cvDestroyWindow( "result" );
return 0;
}

Ответы [ 2 ]

1 голос
/ 13 февраля 2017

Вам нужно увеличить масштаб .. у вас есть 2 способа (просто показывает масштаб для высоты):

1)

Mat testIn(inputRows, inputCols, CV_32F);
Mat testOut(inputRows*2, inputCols, CV_32F);
Size sz = testOut.size();

resize(testIn, testOut, sz, 0.0f, 0.0f, INTER_CUBIC);

, поэтому openCV автоматически вычисляет соотношение между testIn и testOut, используя "sz" (пример: коэффициент "Y" равен sz.height / testIn.Height)

2)

Mat testIn(inputRows, inputCols, CV_32F);
Mat testOut(inputRows*2, inputCols, CV_32F);
Size sz = testOut.size();

resize(testIn, testOut, sz, 2.0f, 0.0f, INTER_CUBIC);

, поэтому openCV использует параметр "2.0f" в качестве отношения (для "Y"), но здесь вы должны убедиться, что testOut имеет достаточный размер для такого отношения

0 голосов
/ 08 марта 2012

IplImage* new_img = img; делает поверхностную копию, поэтому new_img и img указывают на одни и те же данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...