截取图中上方数码管中的数字

基本思路:

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——字符提取并保存的更多相关文章

  1. OpenCV在字符提取中进行的预处理(转)

    OCR简介熟悉OCR的人都了解,OCR大致分为两个部分: -文字提取text extractor -文字识别text recognition 其中,第一部分是属于图像处理部分,涉及到图像分割的知识,而 ...

  2. 把Excel工作簿的每个工作表提取出来保存为新工作簿

    平台:MS office 2010 任务:有个excel工作簿,其中有上百个工作表,要求把每一个工作表全部保存为新工作簿,如果一个一个复制出来太傻了,可以用excel自带的VB解决. 方法:打开工作簿 ...

  3. opencv批处理提取图像的特征

    ____________________________________________________________________________________________________ ...

  4. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  5. opencv 加载 修改 保存 图像

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...

  6. 数字图像处理作业使用OpenCV - 块提取

    今天要记录的是树图第二次作业的第二题,Image Patch Extraction.这个概念真的不难懂,但是如果要我实际写的话,还真的不知道要怎么去遍历图像矩阵来提取块.在此要多谢邓大神的热心帮助,告 ...

  7. python3 selenium模拟登陆斗鱼提取数据保存数据库

    # coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...

  8. opencv——对象提取与测量

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  9. python opencv —— 背景提取(MOG、KNN)、识别与检测(Haar Cascade)

    注意 opencv 的坐标轴,x 轴向右,和 width 对应,y 轴向下,和 height 对应: 1. MOG2 与 KNN MOG:Mixture of Gaussian import cv2 ...

随机推荐

  1. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  2. Java 基础:变量 与 字符串

    变量 Java中没有初始化的变量是不能直接使用的 局部变量 String msg; System.out.print(msg); 就会提示错误,我们必须显式的为变量指定一个初值如null.刚开始学Ja ...

  3. JAVA 并发:CLH 锁 与 AbstractQueuedSynchronizer

    首先向Doug Lea致敬. CLH 以下是CLH锁的一个简单实现: class SimpleCLHLock { /** * initialized with a dummy node */ priv ...

  4. 小程序通过用户授权获取手机号之getPhoneNumber

    小程序有一个获取用户很便捷的api,就是通过getPhoneNumber获取用户的已经绑定微信的手机号码.有一点要大家注意,现在微信和注重用户体验,有些方法都是需要用户主动去触发才能调用的,比如get ...

  5. Git免输入密码提交

    1.首先你需要下载 http://files.cnblogs.com/files/zhanqun/putty.7z 文件夹内包含下面这些文件:

  6. WOSA/XFS PTR Form解析库—头文件

    class AFX_EX_CLASS CNuXfsForm {public: CNuXfsForm(); ~CNuXfsForm(); /******************************* ...

  7. Android Studio 关联 JDK Java 源码

    Android Studio 关联 Android 源码比较方便,一般下载后可自动关联,但是 Android Studio 默认使用的 JDK 是内嵌的,是不带源码的.所以在查看 JDK 源码时,看到 ...

  8. [Objective-C] id类型和instancetype类型

    前些时间在源码里看到instancetype返回类型,一脸惊异,表示接触iOS不久没见过这东西,但发现跟id功能差不多.故查了一些资料,了解了两者之间的区别,故将资料简单翻译整理了一下,为博客充一个数 ...

  9. bootstrap selectpicker 通过代码指定选中值 BootStrap selectpicker后台动态绑定数据 selectpicker 获取选中option的属性或者值

    bootstrap-select使用 bootstrap selectpicker 通过代码指定选中值 $('#subjectno').selectpicker('val',(row.subjectn ...

  10. js实现浏览器用户信息收集

    前言 这是一个通过html5,javascript用于收集用户通过上网泄漏的各种信息,包括地理位置,IP地址,照片,语音,浏览器版本等信息.结合大数据,可实现广告定向投放,用户追踪,用户行为分析,用户 ...