基于OpenCV的循环行、列移动函数circShift()
///*12 在Matlab中有个circShift()函数,可以实现行、列的循环移动
/// 在返卷积运算中,会用到这个函数。所以,在Opencv中我也定义同样
/// 功能的函数
/// 该函数有3个参数,第1个src是输入矩阵或图像,第2、3个参数分别是
/// 沿着'行'方向移动的函数,和沿着‘列’方向移动的列数。
在主函数circShift()中分别调用了两个子涵数:
circRowShift(Mat&src,int shift_m_rows)、
void circColShift(Mat& src,int shift_n_cols)
这两个函数分别实现了行循环移动和列循环移动,函数代码如下:
//*11.循环行、列移动函数circshift():
inline void circRowShift(Mat&src,int shift_m_rows)
{
int m=shift_m_rows;
int rows=src.rows;
//‘行’循环移动
if(m%rows==)
{
return;
} Mat mrows(abs(m),src.cols,src.type());//用于暂时保存末尾的m行数据
if(m>)
{
src(Range(rows-m,rows),Range::all()).copyTo(mrows);
src(Range(,rows-m),Range::all()).copyTo(src(Range(m,rows),Range::all()));
mrows.copyTo(src(Range(,m),Range::all()));
}else
{
src(Range(,-m),Range::all()).copyTo(mrows);
src(Range(-m,rows),Range::all()).copyTo(src(Range(,rows+m),Range::all()));
mrows.copyTo(src(Range(rows+m,rows),Range::all()));
}
}
inline void circColShift(Mat& src,int shift_n_cols)
{
int n=shift_n_cols;
int cols=src.cols;
int rows=src.rows;
if(n%cols==)
{
return;
}
///ncols,如果n>0,用于暂时保存末尾的n列数据
///ncols,如果n<0,用于暂时保存起始的n列数据
Mat ncols(rows,abs(n),src.type());
if(n>)
{
src(Range::all(),Range(cols-n,cols)).copyTo(ncols);
src(Range::all(),Range(,cols-n)).copyTo(src(Range::all(),Range(n,cols)));
ncols.copyTo(src(Range::all(),Range(,n)));
}
else
{
src(Range::all(),Range(,-n)).copyTo(ncols);
src(Range::all(),Range(-n,cols)).copyTo(src(Range::all(),Range(,cols+n)));
ncols.copyTo(src(Range::all(),Range(cols+n,cols)));
} } void circShift(Mat&src,int shift_m_rows,int shift_n_cols)
{
int m=shift_m_rows;
int n=shift_n_cols;
//‘行’循环移动
circRowShift(src,m);
//‘列’循环移动
circColShift(src,n);
}
//*11.行、列循环移动函数circshift() 结束
测试程序,对imgc移动3列:
int main()
{
// Mat img1=imread("D:/CodeWork/MyImage/baboon.jpg",0);
Mat imgc=(Mat_<uchar>(,)
<<,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,);
Mat imgr=imgc.t();
cout<<"original imgc="<<endl<<imgc<<endl;
circShift(imgc,,);
// circShift(imgc,0,3);
cout<<"3 cols-shifted imgc="<<endl<<imgc<<endl;
waitKey();
return ;
}
运行结果如下:

测试程序,对imgr移动3行:
int main()
{
// Mat img1=imread("D:/CodeWork/MyImage/baboon.jpg",0);
Mat imgc=(Mat_<uchar>(,)
<<,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,);
Mat imgr=imgc.t();
cout<<"original imgr="<<endl<<imgr<<endl;
circShift(imgr,,);
cout<<"3 rows-shifted imgr="<<endl<<imgr<<endl;
waitKey();
return ;
}
运行结果如下:

基于OpenCV的循环行、列移动函数circShift()的更多相关文章
- 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()
7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之一
基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...
- 基于opencv的小波变换
基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...
- 基于OpenCV的火焰检测(一)——图像预处理
博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...
- 每日一练之自适应中值滤波器(基于OpenCV实现)
本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
- Csharp调用基于Opencv编写的类库文件
现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW. 一.CLR编写的DLL部分 1.按照正常方法引入Ope ...
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
随机推荐
- java poi 读取excel内容
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import or ...
- 关于HTML5视频标签的问题
一.基本 video标签在兼容性上还是比较差的,如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8的(Opera.Mozilla.Chrome),支持H.264的( ...
- MySQL(MariaDB)默认密码和修改方法
由于笔者只测试过Ubuntu 16.04.4.Ubuntu 19.04和Debian 9,此方法不确定在其他版本下适用. 本文章介绍的方法同样适用于这样的错误信息. ➜ ~ mysql -u root ...
- win.10 禁止自动更新
· Windows 10:“我已经更新完毕,请重启我吧主人!” · Windows 10:“好吧,主人在忙,我重启了先~” · Windows 10: “正在配置windows ...
- 51 Nod 1402 最大值
1402 最大值 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 一个N长的数组s[](注意这里的数组初始下标设为1 ...
- 2019南昌网络赛 J Distance on the tree 主席树+lca
题意 给一颗树,每条边有边权,每次询问\(u\)到\(v\)的路径中有多少边的边权小于等于\(k\) 分析 在树的每个点上建\(1\)到\(i\)的权值线段树,查询的时候同时跑\(u,v,lca ...
- 如何设计出优美的Web API?
概述 WEB API的应用场景非常丰富,例如:将已有系统的功能或数据开放给合作伙伴或生态圈:对外发布可嵌入到其他网页的微件:构建前后端分离的WEB应用:开发跨不同终端的移动应用:集成公司内部不同系统等 ...
- 22.Python赋值运算符(入门必读)
赋值运算符主要用来为变量(或常量)赋值,在使用时,既可以直接用基本赋值运算符“=”将右侧的值赋给左侧的变量,右侧也可以在进行某些运算后再赋值给左侧的变量. = 基本赋值运算符 Python 使用“=” ...
- 记一次protobuf和hbase自带protobuf版本冲突的解决
使用protobuf生产模板代码,使用的版本是: <dependency> <groupId>com.google.protobuf</groupId> <a ...
- MySQL_(Java)使用JDBC向数据库中修改(update)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...