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

基本思路:

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. 什么是Solr

    什么是Solr Lucene复习: 1.什么是lucene:全文检索工具包 2.Lucene的工作原理: 索引数据的创建 从原始文件中提取一些可以用来搜索的数据(封装成各种Field),把各field ...

  2. Java三大特性:封装,继承,多态

    java提高篇(一)-----理解java的三大特性之封装 概念: 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独 ...

  3. 开源框架--NFine.Framework学习(01)

    框架底层采用经典DDD架构,UI层采用jQuery+Bootstrap打造而成的一套符合中国式操作习惯的快速开发框架. 前后端使用技术 1.前端技术 JS框架:jquery-2.1.1.Bootstr ...

  4. Node操作MongoDB并与express结合实现图书管理系统

    Node操作MongoDB数据库 原文链接:http://www.xingxin.me/ Web应用离不开数据库的操作,我们将陆续了解Node操作MongoDB与MySQL这是两个具有代表性的数据库, ...

  5. 微信小程序< 3 > ~ 微信小程序开源项目合集

    简介 移动开发者想学习微信小程序需要学习一点HTML ,CSS和JS才能够比较快速的上手,参考自己学习Android学习过程,阅读源码是一个很好的方式,所以才收集了一些WeApp的开源项目. awes ...

  6. OSGI企业应用开发(六)细说Blueprint & Gemini Blueprint(一)

    上篇文章介绍了如何使用Blueprint將Spring框架整合到OSGI应用的Bundle中,从上篇文章中我们大概了解了Blueprint与Gemini Blueprint的关系,简单的说,Bluep ...

  7. 如何在PeopleSoft中找到并更改默认样式表名称

    PeopleSoft的默认样式表名称是用来控制应用程序的外观的.在PeopleSoft中可以使用集中样式表来更改应用程序的外观,oracle为每个应用程序版本设置了默认的样式表. 下面是不同应用程序版 ...

  8. Android解析WindowManager(一)WindowManager体系

    前言 WindowManagerService(WMS)和AMS一样,都是Android开发需要掌握的知识点,同样的,WMS也很复杂,需要多篇文章来进行讲解,为何更好的理解WMS,首先要了解Windo ...

  9. [Android] 针对生成的图片文件在系统Gallery不显示的处理

    之前遇到过一个问题,就是发现我在程序中生成一个新的 Bitmap 之后,当我打开系统的 Gallery 查看时,并没有看到新生成的图像.然而打开文件浏览器,找到保存 Bitmap 所在的文件夹下,还能 ...

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

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