我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1840|回复: 4

[技术文章] 【Rayeager PX2分享】OpenCV入门之图像缩放

[复制链接]

该用户从未签到

36

主题

1

回帖

33

积分

一级逆天

积分
33

社区居民

QQ
发表于 2015-5-7 14:33:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在实际应用中,我们经常需要将某种尺寸的图像转换为其他尺寸的图像,比如放大或缩小图像。实现图像缩放的功能主要涉及到两个关键的函数:cvResize和cvCreateImage。
关键函数介绍:
1.cvResize
void cvResize(
    const CvArr* src,
    CvArr* dst,
    Int interpolation = CV_INTER_LINEAR
);
函数说明:
第一个参数表示输入的图像。
第二个参数表示输出的图像。
第三个参数指定插值方法,默认为线性插值法,可用的插值方法如下:
CV_INTER_NN                   含义:最近邻插值
CV_INTER_LINER              含义:线性插值
CV_INTER_AREA               含义:区域插值
CV_INTER_CUBIC            含义:三次样条插值


一般情况下,我们期望源图像和重采样后的目标图像之间的映射尽可能地平滑。参数interpolation就是控制如何进行映射。当缩小图像时,目标图像的像素会映射为源图像中的多个参数,这时需要进行插值。当放大图像时,目标图像上的像素可能无法在源图像中找到精确对应的像素,也需要进行插值。最简单的方法试将目标图像各点的像素值设为源图像中与其距离最近的像素值,这就是当interpolation设为CV_INTER_NN时用的算法。
采用线性插值算法(CV_INTER_LINER),将根据源图像附件的4个邻近像素的线性加权计算得出,权重由这4个像素到精确目标点的距离决定。
采用区域插值(CV_INTER_AREA)是用新的像素点覆盖原来的像素点,然后求取覆盖区域的平均值。
采用三次样条插值(CV_INTER_CUBIC)是对源图像附件的4X4个邻近像素进行三次样条拟合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值。


2. cvCreateImage
函数原型:
IplImage* cvCreateImage(CvSize size, intdepth, intchannels);

函数说明:
第一个参数表示图像的大小;
第二个参数表示图像的深度;
第三个参数表示图像的通道数。

以下是使用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;        //缩放倍数
    CvSize czSize;        //目标图像尺寸
   
    //从文件中读取图像
    IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);  
    IplImage *pDstImage = NULL;
   
    //计算目标图像大小
    czSize.width = pSrcImage->width * fScale;  
    czSize.height = pSrcImage->height * fScale;
   
    //创建图像并缩放
    pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);  
    cvResize(pSrcImage, pDstImage, CV_INTER_AREA);
   
    //创建窗口
    cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
    cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE);
   
    //在指定窗口中显示图像
    cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
    cvShowImage(pstrWindowsDstTitle, pDstImage);
   
    //等待按键事件
    cvWaitKey();
   
    //保存图片
    cvSaveImage(pstrSaveImageName, pDstImage);
      
          //销毁显示图像文件的窗口
    cvDestroyWindow(pstrWindowsSrcTitle);  
    cvDestroyWindow(pstrWindowsDstTitle);
   
    //释放为图像分配的内存  
    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)  
# 可执行文件  
TARGET = image_resizing  
$(TARGET)(OBJECTS)  
    g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS)  
$(OBJECTS)(SOURCES)  
    g++ -c $(SOURCES)  
clean:  
    rm $(OBJECTS) $(TARGET)  
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件  
%.o:%.cpp  
    g++ -I $(INCLUDE) -o $@ -c $<


在源代码所在的文件夹中make生成可执行文件image_resizing,之后./image_resizing Rayeager_PX2.jpg就能实现图像缩放,并且缩放的图像保存在当前文件夹中,文件名为Rayeager_PX2_Resizing.jpg
20150412203812_57177.jpg 20150412203831_70035.jpg


代码:
image_resizing.rar (75 KB, 下载次数: 0)

感谢 Ickey电子工程社区fjjjnk1234的分享
回复

使用道具 举报

该用户从未签到

16

主题

218

回帖

256

积分

二级逆天

积分
256

社区居民忠实会员终身成就奖

QQ
发表于 2015-5-7 16:38:08 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

2

主题

346

回帖

355

积分

二级逆天

积分
355

社区居民最爱沙发终身成就奖

QQ
发表于 2015-5-7 17:37:56 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

19

主题

723

回帖

1160

积分

1元学习PADS(3期)

积分
1160

社区居民终身成就奖

QQ
发表于 2015-5-7 17:41:30 | 显示全部楼层
回复

使用道具 举报

头像被屏蔽

该用户从未签到

29

主题

1665

回帖

24

积分

禁止发言

积分
24

社区居民忠实会员社区劳模终身成就奖

QQ
发表于 2015-5-8 08:39:24 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

公告:服务器刚移机,
大家请不要下载东西。
会下载失败


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表