OpenCV——字符提取并保存
截取图中上方数码管中的数字
基本思路:
1、将图像转化为灰度图
2、截取ROI区域
3、二值化
4、循环遍历每一行和每一列,得到字符的坐标
5、截取并保存

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include <stdio.h> using namespace cv;
using namespace std; int getColSum(Mat& src, int t);
int getRowSum(Mat& src, int t);
void cutLeft(Mat& src, Mat& leftImg, Mat& rightImg);
void cutTop(Mat& src, Mat& dstImg); int main()
{
Mat src = imread("数字.jpg", );
threshold(src, src, , , THRESH_BINARY|THRESH_OTSU);
imshow("origin", src); Mat roi = src(Rect(, , src.cols-, ));//截取ROI区域
imshow("ROI", roi);
//形态学操作去除干扰
Mat kernel = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
morphologyEx(roi, roi, MORPH_OPEN, kernel); Mat kernel2 = getStructuringElement(MORPH_RECT, Size(,), Point(-, -));
dilate(roi, roi, kernel2);
imshow("ROI", roi); Mat leftImg, rightImg; rightImg = roi.clone();
string nameLeft[] = {"digital_1.jpg","digital_2.jpg" ,"digital_3.jpg" ,"digital_4.jpg" ,"digital_5.jpg" };
for (int i = ; i < ; i++) { cutLeft(rightImg, leftImg, rightImg);
imwrite(nameLeft[i], leftImg);//保存
} waitKey();
return ;
}
//函数作用:计算某一列的像素和
//输入为二值图像
int getColSum(Mat& src, int t) {
int rowNumber = src.rows;//行数
int colNumber = src.cols;//列数
uchar ColSum = ;
for (int i = ; i < rowNumber; i++)
{
for (int j = ; j < colNumber; j++)
{
if (j == t)
{ ColSum += src.at<uchar>(i, j);
} }
}
return ColSum;
} int getRowSum(Mat& src, int t) {
int rowNumber = src.rows;//行数
int colNumber = src.cols;//列数
uchar RowSum = ;
for (int i = ; i < rowNumber; i++)
{
if (i== t)
{ for (int j = ; j < colNumber; j++)
{ RowSum += src.at<uchar>(i, j); }
}
}
return RowSum;
}
void cutLeft(Mat& src, Mat& leftImg, Mat& rightImg)//左右切割
{
int left, right;
left = ;
right = src.cols; //循环遍历每一列,记录下左端的坐标
int i;
for (i = ; i < src.cols; i++)
{
int colValue = getColSum(src, i);
//cout <<i<<" th "<< colValue << endl;
if (colValue > )
{
left = i;
break;
}
} //接着循环遍历每一列,记录下右端的坐标
for (; i < src.cols; i++)
{
int colValue = getColSum(src, i);
//cout << i << " th " << colValue << endl;
if (colValue == )
{
right = i;
break;
}
} int width = right - left;//计算字符的宽度 Rect rect(left, , width, src.rows);
leftImg = src(rect);
Rect rectRight(right, , src.cols - right, src.rows);
rightImg = src(rectRight);
cutTop(leftImg, leftImg); } void cutTop(Mat& src, Mat& dstImg)//上下切割
{
int top, bottom;
top = ;
bottom = src.rows; int i;
for (i = ; i < src.rows; i++)
{
int colValue = getRowSum(src, i);
//cout <<i<<" th "<< colValue << endl;
if (colValue > )
{
top = i;
break;
}
}
for (; i < src.rows; i++)
{
int colValue = getRowSum(src, i);
//cout << i << " th " << colValue << endl;
if (colValue == )
{
bottom = i;
break;
}
} int height = bottom - top;
Rect rect(, top, src.cols, height);
dstImg = src(rect);
}
OpenCV——字符提取并保存的更多相关文章
- OpenCV在字符提取中进行的预处理(转)
OCR简介熟悉OCR的人都了解,OCR大致分为两个部分: -文字提取text extractor -文字识别text recognition 其中,第一部分是属于图像处理部分,涉及到图像分割的知识,而 ...
- 把Excel工作簿的每个工作表提取出来保存为新工作簿
平台:MS office 2010 任务:有个excel工作簿,其中有上百个工作表,要求把每一个工作表全部保存为新工作簿,如果一个一个复制出来太傻了,可以用excel自带的VB解决. 方法:打开工作簿 ...
- opencv批处理提取图像的特征
____________________________________________________________________________________________________ ...
- OpenCV代码提取:遍历指定目录下指定文件的实现
前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...
- opencv 加载 修改 保存 图像
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...
- 数字图像处理作业使用OpenCV - 块提取
今天要记录的是树图第二次作业的第二题,Image Patch Extraction.这个概念真的不难懂,但是如果要我实际写的话,还真的不知道要怎么去遍历图像矩阵来提取块.在此要多谢邓大神的热心帮助,告 ...
- python3 selenium模拟登陆斗鱼提取数据保存数据库
# coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...
- opencv——对象提取与测量
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...
- python opencv —— 背景提取(MOG、KNN)、识别与检测(Haar Cascade)
注意 opencv 的坐标轴,x 轴向右,和 width 对应,y 轴向下,和 height 对应: 1. MOG2 与 KNN MOG:Mixture of Gaussian import cv2 ...
随机推荐
- POJ3159(KB4-K 差分约束)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 33283 Accepted: 9334 Descrip ...
- JavaScript--事件对象(25)
// JavaScript事件的一个重要的方面是它们拥有一些相对一致的特点,可以给开发提供强大的功能; // 最方便和强大的就是事件对象,它们可以帮你处理鼠标事件和键盘敲击方面的情况; // 此外还可 ...
- easyui+webuploader+ckeditor实现插件式多图片上传
需求:在ckeditor编辑器上实现多图片上传并要求另外单独选择ckeditor上传的图片作为封面 页面效果说明: 动态效果图: 第一步:页面布局 <html xmlns="http: ...
- SQL2008R2数据库日志太大收缩方法
1.登陆项目平台数据库服务器.双击SQL Server Management Studio打开数据库管理.登陆数据库 2.如下图,打开数据库属性窗口 3.如下图,更改数据库恢复模式 4.如下图,收缩数 ...
- [Objective-C] 从NSInteger说开去
在iOS开发过程中,我一直习惯于使用C语法里的基本类型,而很少用(除非必须使用)Foundation的数据类型.最近看了一些资料,发现自己这样写可能有风险,虽然目前没遇到过相关的问题,但这是非常需要注 ...
- docker基础:dockerfile的介绍
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像.我们会先介绍 Dockerfile 的基本结构及其支持的众多指令,并具体讲解通过执行指令来编写 ...
- Jboss 4.2.3配置与优化
1 Jboss内存优化 修改这个两参数,给jvm分配适当的内存,一般为服务器的3/4内存量,推荐至少使用4G内存. 另外添加两个参数 -XX:+UseParallelGC -XX:+UseP ...
- 总结Linux 下Redis 操作常用命令(转)
Redis的配置 Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# tar xzf redis-2.8 ...
- 使用TaskScheduler 调度器 实现跨线程的控件访问
//任务调度器 TaskScheduler UIscheduler = null; public Form1() { //获取任务调度器 UIscheduler = TaskScheduler.Fro ...
- Django之url映射
url映射的作用 根据Django的MTV模式,url的映射是根据用户输入或传送而来的url路径,来进行区分去执行相应的view函数来响应用户的操作. url映射的方式 Django项目的创建后,会自 ...