基于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实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
随机推荐
- JS文件上传代码
var formData = new FormData(); formData.append("file",$("#File1")[0].files[0]); ...
- Kafka、RabbitMQ、RocketMQ等 消息中间件 介绍和对比
文章目录 1.前言 2.概念 2.1.MQ简介 2.2.MQ特点 2.2.1.先进先出 2.2.2.发布订阅 2.2.3.持久化 2.2.4.分布式 3.消息中间件性能究竟哪家强? 3.1.Kafka ...
- pip install --upgrade pip
pip install --upgrade pip python库中urllib3 (1.24.3) or chardet (2.2.1) 的版本不兼容 解决如下: # pip uninstall u ...
- Javac可以编译,Java显示找不到或无法加载主类
运行时候加入完整包名.
- 01- ES6、jquery源码、node、webpack
1.课程介绍 小马哥blog:https://www.cnblogs.com/majj/ 前端学习路径:https://www.processon.com/view/link/5d3a5947e4b0 ...
- Linux安装JAVA web环境
一:安装jdk 1.下载 在oracle下载东西的时候因为oracle的一些验证机制,所以需要在链接前面添加一些参数 wget --no-check-certificate --no-cookie ...
- cookbook 6.2 定义常量
任务: 需要定义一些模块级别的变量(比如命名的常量),而且客户代码无法将其重新绑定: 解决方案: #coding = utf-8 class _const(object): class ConstEr ...
- Confluence 6.15 修改历史(Change-History)宏
修改历史(Change-History)宏显示了页面一个的更新历史:版本号,作者,日期和备注.这些内容将会在同一栏中进行显示. 屏幕截图:Confluence 中的修改历史(Change-Histor ...
- PCI-CAN卡驱动与数据通信调试小记
以前做项目,不注意记录调试过程中遇到的问题,以后应该注意这一点.今天抽空总结一下PCI-CAN卡驱动与数据通信调试过程中遇到的问题,方便以后回忆和思考. 1. 中断服务之字节流报文组包状态机 这是一个 ...
- java中如何根据函数查询引用的jar包
选中函数,按Ctrl+Shift+T,就可以弹出对应的jar包地址 例如: