#pragma once
#include <opencv2/opencv.hpp>
using namespace cv;
typedef unsigned int uint;
class WinSlide
{
public:
WinSlide(Mat& src_img, Size win_size, Size win_stride = Size(1,1));
bool read(Mat& win);
private:
Mat srcImg; //原图像
Size winSize; //窗口大小
Size winStride; //滑动步长,默认(1*1)
uint x_count; //x轴计数
uint y_count; //y轴计数
Rect winRect; //窗口区域
bool isEnd; //是否扫描完毕
};
#include "WinSlide.h"
WinSlide::WinSlide(Mat& src_img, Size win_size, Size win_stride)
{
srcImg = src_img;
winSize = win_size;
winStride = win_stride;
winRect = Rect(Point(0,0), win_size); //初始化窗口区域从左上顶点开始
x_count = 0;
y_count = 0;
isEnd = false;
}
bool WinSlide::read(Mat& win)
{
if (winRect.br() == Point(srcImg.cols, srcImg.rows))
return isEnd; //扫描完毕
//平移窗口,循环扫描
winRect = Rect(Point(0,0), winSize) + Point(x_count, y_count);
win = srcImg(winRect); //输出当前窗口区域的图像
x_count += winStride.width; //水平平移计数
if (winRect.br().x == srcImg.cols) //是否到达了图像右侧边界,准备换行
{
x_count = 0; //水平平移计数清零
y_count += winStride.height; //垂直平移计数(换行)
}
return !isEnd; //没有扫描完毕
}
//#include <Eigen/Dense>
#include <opencv2/opencv.hpp>
#include "WinSlide.h"
using namespace cv;
using namespace std;
typedef unsigned int uint;
int main()
{
Mat img = imread("E:\\Datasets\\Ball\\img0001.jpg");
Mat imgROI;
WinSlide win_slide(img, Size(3,3));
while (win_slide.read(imgROI))
{
imshow("ROI", imgROI);
waitKey(1);
}
return 0;
}