opencv-字符分割

这是我从别人那学来的,这里在原有的基础上做了一些修改,然后也添加了一些C++的理解知识

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std ;
using namespace cv;
#include 
Mat src_threshold;
Mat src_dil;
int main() {
	Mat img = imread("D:\\vspic\\picture\\number7.jpg");
	Mat gray_img;
	// 生成灰度图像
	cvtColor(img, gray_img, CV_BGR2GRAY);
	// 高斯模糊
	Mat img_gau;
	GaussianBlur(gray_img, img_gau, Size(3, 3), 0, 0);
	// 阈值分割
	Mat img_seg;
	threshold(img_gau, img_seg, 0, 255, THRESH_BINARY + THRESH_OTSU);
	Mat element;
	element=getStructuringElement(MORPH_RECT,Size(9,9));
	erode(img_seg,src_dil,element);
	imshow("src_dil",src_dil);
	// 边缘检测,提取轮廓
	Mat img_canny;
	Canny(src_dil, img_canny, 200, 100);
	imshow("canny",img_canny);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy(contours.size());
	findContours(img_canny, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point());//寻找轮廓
	int size = (int)(contours.size());//轮廓的数量
	//cout<
	// 保存符号边框的序号
	vector<int> num_order;//定义一个整型int容器
	map<int, int> num_map;//容器,需要关键字和模板对象两个模板参数,此处定义一个int作为索引,并拥有相关连的指向int的指针
	for (int i = 0; i < size; i++)
   {
		// 获取边框数据
		Rect number_rect = boundingRect(contours[i]);
		int width = number_rect.width;//获取矩形的宽
		int height = number_rect.height;//获取矩形的高
		// 去除较小的干扰边框,筛选出合适的区域
		if (width > img.cols/20 )
		{
			rectangle(img,number_rect.tl(),number_rect.br(),Scalar(255,255,255),1,1,0);//绘制矩形
			imshow("img",img);//显示矩形框
			num_order.push_back(number_rect.x);//把矩形的x坐标放入number_order容器中,将一个新的元素添加到vector的最后面,
			//位置为当前元素的下一个元素
			num_map[number_rect.x] = i;//向map中存入键值对,number_rect.x是关键字,i是值
			/*把矩形框的x坐标与对应的i值一起放入map容器中,形成一一对应的键值对
			*/
		}
	}
	// 按符号顺序提取
	sort(num_order.begin(), num_order.end());//把number_order容器中的内容按照从小到大的顺序排列
	for (int i = 0; i < num_order.size(); i++) {
		Rect number_rect = boundingRect(contours[num_map.find(num_order[i])->second]);
		Rect choose_rect(number_rect.x, 0, number_rect.width, gray_img.rows);
		Mat number_img = gray_img(choose_rect);
		imshow("number" + to_string(i), number_img);
		// imwrite("number" + to_string(i) + ".jpg", number_img);
	}
	imshow("添加方框", gray_img);
	waitKey(0);
	return 0;
}

push_back()函数的用法

向容器中添加新的元素,这里先不管是在什么位置添加的,只需要知道它的作用就行

sort()函数的用法
```这个函数有三个参数,数组的起始位置,数组的结束位置,和排序方式,默认的是从小到大的排序

```cpp
find()函数

用来定位数据出现的位置,它返回一个迭代器,当数据出现时,他返回数据出现位置的迭代器,

find()->first//是获取键值对的键
find()->second//是获取键值对的值

你可能感兴趣的:(opencv学习笔记,C++学习)