水平投影切割

#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利用投影法进行水平切割和垂直切割相关推荐

  1. opencv学习---计算图像的水平积分投影和垂直积分投影

    opencv学习---计算图像的水平积分投影和垂直积分投影 标签: opencv水平积分投影垂直积分投影 2016-12-07 18:48 1806人阅读 评论(1) 收藏 举报 分类: opencv ...

  2. 【OpenCV】利用投影法进行字符分割

    1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...

  3. 使用OpenCV实现图像中的文字切割

    前言 1.做文字识别相关的项目,首先是检测字符区域,然后进行水平切割,得到整行的文字,其次要考虑的就是怎么将每一个字符分开,并且从图片中切割下来,然后才可以导入训练好的模型进行字符识别.在字符单个切割 ...

  4. OpenCV笔记—投影与三维测量

    OpenCV笔记-投影与三维测量 一.立体成像 1.1 概述 1.2 三角测量 1.3 对极几何 1.4 本征矩阵与基本矩阵 1.4计算极线 1.5立体标定 1.6立体校正 1.7 校正映射 1.8 ...

  5. 投影法字符分割matlab,利用投影法进行字符分割

    1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...

  6. Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中

    Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中e中 目录 利用pandas实现行数据添加,即将字典格式的数据,按照行 ...

  7. 利用WinRAR命令行压缩文件或文件夹

    利用WinRAR命令行压缩文件或文件夹 2007-11-14 15:07 压缩文件夹winrar.exe a -ag -k -r -s -ibck c:/bak.rar c:/dat/ 压缩多个文件 ...

  8. 利用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/ 压缩多个文件 ...

  9. OpenCV使用形态学转换提取水平和垂直线的实例(附完整代码)

    OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 #include <opencv2/core ...

最新文章

  1. 常用jQuery ajax代码片段
  2. 16. Logging 模块的配置与使用
  3. git push代码出现push rejected错误
  4. shared_ptr和new结合使用的几个简单例子
  5. java有password_hash吗,java 实现 PHP password_hash() password_verify() 单向验证
  6. 解码错误。‘gb2312‘ codec can‘t decode byte 0xf3 in position 307307: illegal multibyte sequence
  7. 2011年软件研发十大关键词盘点
  8. nosql----redis数据恢复方案
  9. 【JVM】强引用、软引用、弱引用、虚引用分别是什么
  10. 全国DEM下载教程 90米、30米、12.5米和5米等各种精度DEM数据
  11. 音视频开发之旅(41)-天空盒
  12. “李记餐厅”微信点餐小程序的设计与实现
  13. Java 截取字符串
  14. 配置OPTIONS方法服务器响应,nginx设置X-Frame-Options的两种方法
  15. Jetson nano使用-- ROS安装记录
  16. Qt 动态实时显示波形图
  17. 计算机安全知识有哪些方面,信息安全的基本属性包括哪些方面?
  18. 面向建筑应用的三维点云数据获取和处理的计算方法
  19. 「1121」Damn Single
  20. 中国平安保险公司数据备份解决方案

热门文章

  1. 抖音创作规范_抖音作品在内容规划是应该要注意的一些问题分析
  2. ApacheCN 翻译活动进度公告 2019.4.23
  3. 如何在网格上绘画【UE4】
  4. 解决高德地图在线API不支持对应的方法回调返回结果的问题
  5. abap学习笔记-SAP字段与表的对应关系
  6. Android Studio Canvas 实现鼠标贝塞尔曲线拖尾特效(富文本编辑器)
  7. 九、快速入门高等数学的导数和微积分篇
  8. BCD工艺、CMOS工艺、BiCMOS工艺
  9. 计算机专业英语第04章,2021计算机专业英语第四章
  10. RED5 1.0视频直播服务器 WINDOWS安装记录 教程