opencv利用投影法进行水平切割和垂直切割
水平投影切割
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{IplImage * src = cvLoadImage("img1.jpg");IplImage *dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);IplImage *img = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);cvThreshold(src, dst, 100, 255, CV_THRESH_BINARY);IplImage* painty = cvCreateImage(cvGetSize(dst), IPL_DEPTH_8U, 1);cvZero(painty);int* h = new int[dst->height];memset(h, 0, dst->height * 4);int x, y;CvScalar s, t;//可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的 for (y = 0; y<dst->height; y++){for (x = 0; x<dst->width; x++){s = cvGet2D(dst, y, x);if (s.val[0] == 0)h[y]++;}}for (y = 0; y<dst->height; y++){for (x = 0; x<h[y]; x++){t.val[0] = 255;cvSet2D(painty, y, x, t);}}vector<Mat> roiList;//用于储存分割出来的每个字符int startIndex = 0;//记录进入字符区的索引int endIndex = 0;//记录进入空白区域的索引bool inBlock = false;//是否遍历到了字符区内char szName[30] = { 0 };for (int i = 0; i < dst->height; ++i){if (!inBlock && h[i] !=0)//进入字符区了{inBlock = true;startIndex = i;cout << "startIndex is " << startIndex << endl;}else if (h[i] ==0 && inBlock)//进入空白区了{endIndex = i;inBlock = false;Mat dst1(src, 0);Mat roiImg;if (endIndex - startIndex>3){roiImg = dst1(Range(startIndex, endIndex + 1), Range(0, dst1.cols));roiList.push_back(roiImg);sprintf(szName, "aa%d.jpg", i);imshow(szName, roiImg);imwrite(szName, roiImg);} }} cvNamedWindow("二值图像", 1);cvNamedWindow("水平投影", 1);cvShowImage("二值图像", dst);cvShowImage("水平投影", painty);cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&dst);cvReleaseImage(&painty);return 0;
}
分割原图
水平投影图
分割结果图
垂直切割
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{IplImage * src = cvLoadImage("aa146.jpg");IplImage *dst = cvCreateImage(cvGetSize(src), 8, 1);IplImage *img = cvCreateImage(cvGetSize(src), 8, 1);//cvSmooth(src, src, CV_BLUR, 3, 3, 0, 0);cvCvtColor(src, img, CV_BGR2GRAY);cvThreshold(img, dst, 135, 255, CV_THRESH_BINARY);IplImage* paintx = cvCreateImage(cvGetSize(dst), IPL_DEPTH_8U, 1);cvZero(paintx);int* v = new int[dst->width]; memset(v, 0, dst->width * 4);int x, y;CvScalar s, t;//可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的 //垂直投影 for (x = 0; x<dst->width; x++){for (y = 0; y<dst->height; y++){s = cvGet2D(dst, y, x); //cvGet2D() 的函数原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1); //函数返回的是一个CvScalar 容器,其参数中也有两个方向的坐标, //但跟我们平常习惯的坐标不一样的是,idx0代表是的行,即高度,对应于我们平常坐标系的y, //idx1代表的是列,即宽度,对应于我们平常坐标系的x,cvSet2D() 也类似。 //printf("area == %lf\n",s); if (s.val[0] == 0)v[x]++;}}for (x = 0; x<dst->width; x++){for (y = 0; y<v[x]; y++){t.val[0] = 255;cvSet2D(paintx, y, x, t);}}cvShowImage("原图", src);cvShowImage("垂直投影", paintx);//分割vector<Mat> roiList;//用于储存分割出来的每个字符int startIndex = 0;//记录进入字符区的索引int endIndex = 0;//记录进入空白区域的索引bool inBlock = false;//是否遍历到了字符区内char szName[30] = { 0 };for (int i = 0; i < dst->width; ++i){if (!inBlock && v[i] != 0)//进入字符区了{inBlock = true;startIndex = i;cout << "startIndex is " << startIndex << endl;}else if (v[i] == 0 && inBlock)//进入空白区了{endIndex = i;inBlock = false;Mat dst1(src, 0);Mat roiImg;if (endIndex - startIndex>3){roiImg = dst1(Range(0, dst1.rows), Range(startIndex, endIndex + 1));roiList.push_back(roiImg);sprintf(szName, "aaa%d.jpg", i);imshow(szName, roiImg);imwrite(szName, roiImg);}}}cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&dst);cvReleaseImage(&paintx);return 0;
}
原图和垂直投影图
切割结果图
opencv利用投影法进行水平切割和垂直切割相关推荐
- opencv学习---计算图像的水平积分投影和垂直积分投影
opencv学习---计算图像的水平积分投影和垂直积分投影 标签: opencv水平积分投影垂直积分投影 2016-12-07 18:48 1806人阅读 评论(1) 收藏 举报 分类: opencv ...
- 【OpenCV】利用投影法进行字符分割
1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...
- 使用OpenCV实现图像中的文字切割
前言 1.做文字识别相关的项目,首先是检测字符区域,然后进行水平切割,得到整行的文字,其次要考虑的就是怎么将每一个字符分开,并且从图片中切割下来,然后才可以导入训练好的模型进行字符识别.在字符单个切割 ...
- OpenCV笔记—投影与三维测量
OpenCV笔记-投影与三维测量 一.立体成像 1.1 概述 1.2 三角测量 1.3 对极几何 1.4 本征矩阵与基本矩阵 1.4计算极线 1.5立体标定 1.6立体校正 1.7 校正映射 1.8 ...
- 投影法字符分割matlab,利用投影法进行字符分割
1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...
- Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中
Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中e中 目录 利用pandas实现行数据添加,即将字典格式的数据,按照行 ...
- 利用WinRAR命令行压缩文件或文件夹
利用WinRAR命令行压缩文件或文件夹 2007-11-14 15:07 压缩文件夹winrar.exe a -ag -k -r -s -ibck c:/bak.rar c:/dat/ 压缩多个文件 ...
- 利用WinRAR命令行压缩文件或文件夹2007-11-14 15:07压缩文件夹
利用WinRAR命令行压缩文件或文件夹 2007-11-14 15:07 压缩文件夹winrar.exe a -ag -k -r -s -ibck c:/bak.rar c:/dat/ 压缩多个文件 ...
- OpenCV使用形态学转换提取水平和垂直线的实例(附完整代码)
OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 #include <opencv2/core ...
最新文章
- 常用jQuery ajax代码片段
- 16. Logging 模块的配置与使用
- git push代码出现push rejected错误
- shared_ptr和new结合使用的几个简单例子
- java有password_hash吗,java 实现 PHP password_hash() password_verify() 单向验证
- 解码错误。‘gb2312‘ codec can‘t decode byte 0xf3 in position 307307: illegal multibyte sequence
- 2011年软件研发十大关键词盘点
- nosql----redis数据恢复方案
- 【JVM】强引用、软引用、弱引用、虚引用分别是什么
- 全国DEM下载教程 90米、30米、12.5米和5米等各种精度DEM数据
- 音视频开发之旅(41)-天空盒
- “李记餐厅”微信点餐小程序的设计与实现
- Java 截取字符串
- 配置OPTIONS方法服务器响应,nginx设置X-Frame-Options的两种方法
- Jetson nano使用-- ROS安装记录
- Qt 动态实时显示波形图
- 计算机安全知识有哪些方面,信息安全的基本属性包括哪些方面?
- 面向建筑应用的三维点云数据获取和处理的计算方法
- 「1121」Damn Single
- 中国平安保险公司数据备份解决方案