這篇文章將為大家詳細講解有關(guān)OpenCV怎么實現(xiàn)圖像縮放,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
從策劃到設計制作,每一步都追求做到細膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設計、成都網(wǎng)站設計、網(wǎng)站策劃、網(wǎng)頁設計、域名與空間、虛擬主機、網(wǎng)絡營銷、VI設計、 網(wǎng)站改版、漏洞修補等服務。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進步。
在實際應用中,我們經(jīng)常需要將某種尺寸的圖像轉(zhuǎn)換為其他尺寸的圖像,比如放大或縮小圖像。實現(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ù)指定插值方法,默認為線性插值法,可用的插值方法如下:
CV_INTER_NN 含義:最近鄰插值
CV_INTER_LINER 含義:線性插值
CV_INTER_AREA 含義:區(qū)域插值
CV_INTER_CUBIC 含義:三次樣條插值
一般情況下,我們期望源圖像和重采樣后的目標圖像之間的映射盡可能地平滑。參數(shù)interpolation就是控制如何進行映射。當縮小圖像時,目標圖像的像素會映射為源圖像中的多個參數(shù),這時需要進行插值。當放大圖像時,目標圖像上的像素可能無法在源圖像中找到精確對應的像素,也需要進行插值。最簡單的方法試將目標圖像各點的像素值設為源圖像中與其距離最近的像素值,這就是當interpolation設為CV_INTER_NN時用的算法。
采用線性插值算法(CV_INTER_LINER),將根據(jù)源圖像附件的4個鄰近像素的線性加權(quán)計算得出,權(quán)重由這4個像素到精確目標點的距離決定。
采用區(qū)域插值(CV_INTER_AREA)是用新的像素點覆蓋原來的像素點,然后求取覆蓋區(qū)域的平均值。
采用三次樣條插值(CV_INTER_CUBIC)是對源圖像附件的4X4個鄰近像素進行三次樣條擬合,然后將目標像素對應的三次樣條值作為目標圖像對應像素點的值。
2. cvCreateImage
函數(shù)原型:
IplImage* cvCreateImage(CvSize size, intdepth, intchannels);
函數(shù)說明:
第一個參數(shù)表示圖像的大?。?/p>
第二個參數(shù)表示圖像的深度;
第三個參數(shù)表示圖像的通道數(shù)。
以下是使用OpenCV進行圖像縮放的程序。
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;//目標圖像尺寸
//從文件中讀取圖像
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pDstImage = NULL;
//計算目標圖像大小
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
# 目標文件
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ī)則 $@代表目標文件 $< 代表第一個依賴文件
%.o:%.cpp
g++ -I $(INCLUDE) -o $@ -c $<
在源代碼所在的文件夾中make生成可執(zhí)行文件image_resizing,之后./image_resizing Rayeager_PX2.jpg就能實現(xiàn)圖像縮放,并且縮放的圖像保存在當前文件夾中,文件名為Rayeager_PX2_Resizing.jpg
關(guān)于“OpenCV怎么實現(xiàn)圖像縮放”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)頁名稱:OpenCV怎么實現(xiàn)圖像縮放
網(wǎng)頁地址:http://muchs.cn/article16/iejogg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站設計公司、App設計、搜索引擎優(yōu)化、定制網(wǎng)站、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)