opencv学习笔记(四)投影

opencv学习笔记(四)投影

  任选了一张图片用于测试,图片如下所示:

 1 #include <cv.h>
 2 #include <highgui.h>
 3 using namespace std;
 4 using namespace cv;
 5 int main()
 6 {
 7     IplImage * src = cvLoadImage("cat.png", 0); //强制转化读取图像为灰度图
 8     cvShowImage("灰度图像", src);
 9     cvThreshold(src, src, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);//大于0取255,否则取0
10     IplImage* paintx = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//用于垂直投影的图像(单通道)
11     IplImage* painty = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//用于水平投影的图像(单通道)
12     cvZero(paintx);//清零
13     cvZero(painty);//清零
14     int* v = new int[src->width];//用于记录每一列中像素值大于0的个数
15     int* h = new int[src->height];//用于记录每一行中像素值大于0的个数
16     memset(v, 0, src->width * 4);//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->width * 4
17     memset(h, 0, src->height * 4);//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->height * 4
18
19     int x, y;//for循环使用
20     CvScalar s, t;//
21     /*
22         CvScalar是一个可以用来存放4个double数值的数组
23         一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的
24         如何赋值:
25         a) 存放单通道图像中像素:cvScalar(255);
26         b) 存放三通道图像中像素:cvScalar(255,255,255);
27         c)只使用第一个通道,val[0]=val0;等同于cvScalar(val0,0,0,0);
28     */
29     //遍历,统计每一列有多少个值大于0的像素
30     for (x = 0; x<src->width; x++)
31     {
32         for (y = 0; y<src->height; y++)
33         {
34             s = cvGet2D(src, y, x);//获取指定坐标的像素值
35             if (s.val[0]>0)
36                 v[x]++;//当像素值为大于0时,当前列的大于0的像素点加1
37         }
38     }
39
40     //建立垂直投影的图像
41     for (x = 0; x<src->width; x++)
42     {
43         for (y = 0; y<v[x]; y++)
44         {
45             t.val[0] = 255;
46             cvSet2D(paintx, y, x, t);//向像素值大于0的坐标赋值为255
47         }
48     }
49     //遍历,统计每一行有多少个值大于0的像素
50     for (y = 0; y<src->height; y++)
51     {
52         for (x = 0; x<src->width; x++)
53         {
54             s = cvGet2D(src, y, x);//获取指定坐标的像素值
55             if (s.val[0]>0)
56                 h[y]++;//当像素值为大于0时,当前行的大于0的像素点加1
57         }
58     }
59     //建立水平投影的图像
60     for (y = 0; y<src->height; y++)
61     {
62         for (x = 0; x<h[y]; x++)
63         {
64             t.val[0] = 255;
65             cvSet2D(painty, y, x, t);
66         }
67     }
68
69     cvNamedWindow("二值图像", 1);
70     cvNamedWindow("垂直积分投影", 1);
71     cvNamedWindow("水平积分投影", 1);
72     cvShowImage("二值图像", src);
73     cvShowImage("垂直积分投影", paintx);
74     cvShowImage("水平积分投影", painty);
75     cvWaitKey(0);
76     cvDestroyAllWindows();
77     cvReleaseImage(&src);
78     cvReleaseImage(&paintx);
79     cvReleaseImage(&painty);
80     return 0;
81 }

  运行结果:

  1、灰度图像

  

  2、二值图像

  

  3、垂直积分投影

  

  4、水平积分投影

  

时间: 2024-12-06 11:04:57

opencv学习笔记(四)投影的相关文章

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---

OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)

昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述一下步骤吧: 一.安装前准备 1.VS2012(网上看到很多用的VS2010,但是基本不影响) 2.OpenCV 安装包(我下载的是最新的2.4.9) 二.安装OpenCV 1.解压OPenCV 说是安装,其实就是解压,OpenCV的Windows安装程序就是一个自解压程序: 这里我解压到C:\Pr

OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 2013-03-23 17:44 16963人阅读 评论(28) 收藏 举报 分类: 机器视觉(34) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] KAZE系列笔记: OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 OpenCV学习笔记(28)KA

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Opencv学习笔记(六)SURF学习笔记

原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. 看了harris角点检測之后,開始研究SURF角点检測,发现挺复杂的,一时也仅仅了解了大概,把了解的东西总结下,以便下次深入学习. SURF角点检測算法是对SIFT的一种改进,主要体如今速度上,效率更高.它和SIFT的主要差别是图像多尺度空间的构建方法不同. 在计算视觉领域,尺度空间被象征性的表述