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

基本思路:

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. centos下Nginx安装和配置多个域名的虚拟主机

    nginx安装步骤,源码编译安装(源码编译,可以自定制更多功能) openssl #user nobody; worker_processes ; #error_log logs/error.log; ...

  2. APP中内嵌H5页面为什么不能下载?

    在APP中内嵌H5页面,若页面上存在下载链接,没有任何反应,为什么呢? 原因是app中内嵌的H5页面是WebView解析的,什么是WebView呢? 在Android手机中内置了一款高性能webkit ...

  3. Python面试题都在这里了

    转自武沛齐博客:http://www.cnblog.com/wupeiqi/ 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java ...

  4. vue-router重定向 不刷新问题

    前阵子太忙了,自己一个人一边开发着新项目,一边维护着旧项目,没时间写博客,终于让我腾出时间了.废话少说,开始正文. 问题描述: 之前项目是angular开发的,后来用vue重构后.项目路径和vue路径 ...

  5. 浅谈 Event loop (事件循环)

    从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...

  6. Oracle中Database Link的创建和Synonyms

    在工作中我遇到过这样的一个问题,就是当我需要将远程主机上Oracle数据中某个表的数据copy到本地Oracle时,有多种方法可以实现.1.将所需要的数据导出到csv或其他格式的文档,复制到本地进行直 ...

  7. Android studio button 按钮 四种绑定事件的方法

    package com.geli_2.sujie.sujiegeili2testbutton; import android.os.Bundle; import android.support.v7. ...

  8. java实现文件复制粘贴功能

    java编程思想中讲到了IO流的思想,以前对于java基础总是不够深入,浅尝辄止,如今碰到语句插桩的时候就感到书到用时方恨少啊! 文件的复制涉及到源文件和新文件(无需手动创建),给出源文件的路径和文件 ...

  9. 【Python】opencv显示图像

    import cv2 img = cv2.imread("lena.jpg") cv2.namedWindow("Image") cv2.imshow(&quo ...

  10. 《ECMAScript6标准入门》第三版--读书笔记

    2015年6月,ECMAScript 6正式通过,成为国际标准.尽管在目前的工作中还没有使用ES6,但是每项新技术出来总是忍不住想尝尝鲜,想知道ES6能为前端开发带来哪些变化?对自己的工作有哪些方面可 ...