您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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
關(guān)于“OpenCV怎么實(shí)現(xiàn)圖像縮放”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(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)容。