opencv resize image中resize函数 参数fx,fy 应该是一个值,而网上的例子 fx fy 分别(0,0)什么意思啊?

Ubuntu OpenCV中使用cvResize函数或resize函数进行图象放缩
//cvResize函数原型
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); &
src:输入图像.(IplImage)
dst:输出图像.(IplImage)
interpolation:差值方法:&
CV_INTER_NN - 最近邻差值
CV_INTER_LINEAR - 双线性差值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 &CV_INTER_NN &方法
CV_INTER_CUBIC - 立方差值
函数cvResize 将图像 &src 改变尺寸得到与 &dst 同样大小。若设定ROI,函数将按常规支持 ROI.
使用C++编程时使用resize函数进行图像缩放。
//resize函原型
CV_EXPORTS_W void resize( InputArray src, OutputArray dst, &
Size dsize, double fx=0, double fy=0, &
int interpolation=INTER_LINEAR ); &
注:dsize与(fx,fy)不能同时为0。
示例程序:
使用ubuntu14.04+OpenCV 3.1.0
/**------------------------------------------------------------------**/
/**描述:包含程序所依赖的头文件**/
/**------------------------------------------------------------------**/
#include &opencv2/opencv.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &string&
/**------------------------------------------------------------------**/
/**描述:程序所用的命名空间**/
/**------------------------------------------------------------------**/
/**------------------------------------------------------------------**/
/**描述:系统全局常量**/
/**------------------------------------------------------------------**/
//目标图片的文件名,需要放置在工程目录下
const string TagrImg = &Angelababy.jpeg&;
//定义窗口标题
const char SrcWinNa[] = &SrcWindow&;
const char GryWinNa[] = &GryWindow&;
const char ResWinNa[] = &ResWindow&;
/**------------------------------------------------------------------**/
/**描述:系统全局变量**/
/**------------------------------------------------------------------**/
//放缩倍数
double scale=0.4;
int main(int argc, char **argv)
/**原图像的读取及显示-----------------------------------------------**/
//读取图片
Mat SrcImg = imread(TagrImg);
//检查是否读取成功
if(!SrcImg.data)
cout&&&读取失败,程序流产&&&
cout&&&请检查工程目录下是否存在&&&TagrImg&&
return -1;
//创建窗口显示原图像
cvNamedWindow(SrcWinNa, CV_WINDOW_AUTOSIZE);
imshow(SrcWinNa, SrcImg);
/**图片缩放及显示--------------------------------------------------**/
//设置缩放后的图片的尺寸
Size ResImgSiz = Size(SrcImg.cols*scale, SrcImg.rows*scale);
Mat ResImg = Mat(ResImgSiz, SrcImg.type());
resize(SrcImg, ResImg, ResImgSiz, CV_INTER_CUBIC);
//创建窗口用于显示缩放后的图像
cvNamedWindow(ResWinNa, CV_WINDOW_AUTOSIZE);
imshow(ResWinNa, ResImg);
cvWaitKey(0);
将图片缩小到0.5倍的效果图:
本文永久更新地址:
------分隔线----------------------------5408人阅读
OpenCV(1)
OpenCV中的Resize和Reshape都是改变一个矩阵的形状,那它们有哪些不同点呢?
1. Mat::reshape( )&
只是在逻辑上改变矩阵的行列数或者通道数,没有任何的数据的复制,也不会增减任何数据,因此这是一个O(1)的操作,它要求矩阵是连续的。
C++: Mat Mat::reshape(int cn, int rows=0 const)
cn:目标通道数,如果是0则保持和原通道数一致;
rows:目标行数,同上是0则保持不变;
改变后的矩阵要满足 rows*cols*channels &跟原数组相等,所以如果原来矩阵是单通道3*3的,调用Reshape(0,2)是会报错的,因为3*3*1不能被2*1整除。
应用:在提取特征时,往往需要把特征矩阵变成一个行向量
return feature.reshape(0,1).clone();
2. Mat::Resize( )
是改变矩阵的行数,会引起矩阵的重新分配。
C++: void Mat::resize(size_t sz)
C++: void Mat::resize(size_t sz, const Scalar& s)
sz:目标行数
s :如果sz大于原来函数,可以选择填充值
3.cv::resize( )
这个是通过插值的方式来改变图像的尺寸,貌似不支持int型的元素,uchar,float和double都可以。
C++: void resize( InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
dst的尺寸是由dsize,fx和fy决定的,与dst本身的type和size都没有关系。
当size不为0时,可以直接确定dst的大小,这时的fx和fy可以设为0;
当size为0时,fx代表宽度(列)的缩放系数,fy代表高度(行)的缩放系数,这时dsize可以写成Size(),它将默认设置为
& & &dsize = Size(round(fx*src.cols), round(fy*src.rows));
举例说明一下:
#include &opencv2\opencv.hpp&
void main()
cv::Mat M = (cv::Mat_&uchar&(3,3) && 1,2,3,4,5,6,7,8,9);
std::cout&&&原矩阵:\n&&&M&&std::
std::cout&&&mat::reshape:\n&&&M.reshape(0,1)&&std::
M.resize(2);
std::cout&&&mat::resize:\n&&&M&&std::
cv::resize( M,M, Size(2,4) );
std::cout&&&cv::resize:\n&&&M&&std::
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10707次
排名:千里之外
(1)(1)(1)(1)(3)

我要回帖

更多关于 opencv resize image 的文章

 

随机推荐