2012-03-08 4 views
0

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

#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; 
} 
+0

Было бы неплохо прочитать документацию для cvResize. Готов поспорить, это именно то, что вы хотите знать. http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html?highlight=cvresiz#void cvResize (const CvArr * src, CvArr * dst, int интерполяция) – Sam

+0

@vasile большое спасибо. Я понял, что должен указать размер моего выходного изображения, чтобы увидеть разницу. Сначала я этого не осознал. –

ответ

0

IplImage* new_img = img; делает неполную копию так new_img и точка IMG для одних и тех же данных

+0

Я попытался исправить эту ошибку, изменив код. Тем не менее, я все еще вижу, что оба изображения идентичны. Измененный код слишком длинный, чтобы опубликовать комментарий, поэтому я включил его в исходный вопрос под измененным кодом. Я был бы очень признателен, если бы вы могли сказать мне, что изменить, пожалуйста. –

1

Вам необходимо масштабировать до .. у вас есть 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 имеет достаточный размер для такого отношения.