溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

OpenCV怎么實(shí)現(xiàn)圖像縮放

發(fā)布時間:2021-12-13 17:30:30 來源:億速云 閱讀:371 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)OpenCV怎么實(shí)現(xiàn)圖像縮放,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

在實(shí)際應(yīng)用中,我們經(jīng)常需要將某種尺寸的圖像轉(zhuǎn)換為其他尺寸的圖像,比如放大或縮小圖像。實(shí)現(xiàn)圖像縮放的功能主要涉及到兩個關(guān)鍵的函數(shù):cvResize和cvCreateImage。

關(guān)鍵函數(shù)介紹:

1.cvResize

 void cvResize(

const CvArr* src,

CvArr* dst,

Int interpolation = CV_INTER_LINEAR

);

函數(shù)說明:

第一個參數(shù)表示輸入的圖像。

第二個參數(shù)表示輸出的圖像。

第三個參數(shù)指定插值方法,默認(rèn)為線性插值法,可用的插值方法如下:

CV_INTER_NN                   含義:最近鄰插值

CV_INTER_LINER              含義:線性插值

CV_INTER_AREA               含義:區(qū)域插值

CV_INTER_CUBIC            含義:三次樣條插值

一般情況下,我們期望源圖像和重采樣后的目標(biāo)圖像之間的映射盡可能地平滑。參數(shù)interpolation就是控制如何進(jìn)行映射。當(dāng)縮小圖像時,目標(biāo)圖像的像素會映射為源圖像中的多個參數(shù),這時需要進(jìn)行插值。當(dāng)放大圖像時,目標(biāo)圖像上的像素可能無法在源圖像中找到精確對應(yīng)的像素,也需要進(jìn)行插值。最簡單的方法試將目標(biāo)圖像各點(diǎn)的像素值設(shè)為源圖像中與其距離最近的像素值,這就是當(dāng)interpolation設(shè)為CV_INTER_NN時用的算法。

采用線性插值算法(CV_INTER_LINER),將根據(jù)源圖像附件的4個鄰近像素的線性加權(quán)計(jì)算得出,權(quán)重由這4個像素到精確目標(biāo)點(diǎn)的距離決定。

采用區(qū)域插值(CV_INTER_AREA)是用新的像素點(diǎn)覆蓋原來的像素點(diǎn),然后求取覆蓋區(qū)域的平均值。

采用三次樣條插值(CV_INTER_CUBIC)是對源圖像附件的4X4個鄰近像素進(jìn)行三次樣條擬合,然后將目標(biāo)像素對應(yīng)的三次樣條值作為目標(biāo)圖像對應(yīng)像素點(diǎn)的值。

2. cvCreateImage

函數(shù)原型:

 IplImage* cvCreateImage(CvSize size, intdepth, intchannels);

函數(shù)說明:

第一個參數(shù)表示圖像的大小;

第二個參數(shù)表示圖像的深度;

第三個參數(shù)表示圖像的通道數(shù)。

以下是使用OpenCV進(jìn)行圖像縮放的程序。

image_resizing.cpp

 #include <opencv2/core/core.hpp>

#include <opencv2/opencv.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <iostream>

using namespace std;

int main(int argc,char **argv)

{

const char *pstrImageName = "Rayeager_PX2.jpg";

const char *pstrSaveImageName = "Rayeager_PX2_Resizing.jpg";

const char *pstrWindowsSrcTitle = "initial";

const char *pstrWindowsDstTitle = "resizing";

double fScale = 0.314;//縮放倍數(shù)

CvSize czSize;//目標(biāo)圖像尺寸

//從文件中讀取圖像

IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);  

IplImage *pDstImage = NULL;

//計(jì)算目標(biāo)圖像大小

czSize.width = pSrcImage->width * fScale;  

czSize.height = pSrcImage->height * fScale;

//創(chuàng)建圖像并縮放

pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);  

cvResize(pSrcImage, pDstImage, CV_INTER_AREA);

//創(chuàng)建窗口

cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  

cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE);

//在指定窗口中顯示圖像

cvShowImage(pstrWindowsSrcTitle, pSrcImage);  

cvShowImage(pstrWindowsDstTitle, pDstImage);

//等待按鍵事件

cvWaitKey();

//保存圖片

cvSaveImage(pstrSaveImageName, pDstImage);

      //銷毀顯示圖像文件的窗口

cvDestroyWindow(pstrWindowsSrcTitle);  

cvDestroyWindow(pstrWindowsDstTitle);

//釋放為圖像分配的內(nèi)存  

cvReleaseImage(&pSrcImage);  

cvReleaseImage(&pDstImage);  

return 0;

}

makefile:

INCLUDE = $(shell pkg-config --cflags opencv)  

LIBS = $(shell pkg-config --libs opencv)  

SOURCES = image_resizing.cpp  

# 目標(biāo)文件  

OBJECTS = $(SOURCES:.cpp=.o)  

# 可執(zhí)行文件  

TARGET = image_resizing  

$(TARGET):$(OBJECTS)  

g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS)  

$(OBJECTS):$(SOURCES)  

g++ -c $(SOURCES)  

clean:  

rm $(OBJECTS) $(TARGET)  

# 編譯規(guī)則 $@代表目標(biāo)文件 $< 代表第一個依賴文件  

%.o:%.cpp  

g++ -I $(INCLUDE) -o $@ -c $<

在源代碼所在的文件夾中make生成可執(zhí)行文件image_resizing,之后./image_resizing Rayeager_PX2.jpg就能實(shí)現(xiàn)圖像縮放,并且縮放的圖像保存在當(dāng)前文件夾中,文件名為Rayeager_PX2_Resizing.jpg

OpenCV怎么實(shí)現(xiàn)圖像縮放

OpenCV怎么實(shí)現(xiàn)圖像縮放

關(guān)于“OpenCV怎么實(shí)現(xiàn)圖像縮放”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI