opencv学习笔记(四)投影

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

 #include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
int main()
{
IplImage * src = cvLoadImage("cat.png", ); //强制转化读取图像为灰度图
cvShowImage("灰度图像", src);
cvThreshold(src, src, , , CV_THRESH_OTSU + CV_THRESH_BINARY);//大于0取255,否则取0
IplImage* paintx = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );//用于垂直投影的图像(单通道)
IplImage* painty = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );//用于水平投影的图像(单通道)
cvZero(paintx);//清零
cvZero(painty);//清零
int* v = new int[src->width];//用于记录每一列中像素值大于0的个数
int* h = new int[src->height];//用于记录每一行中像素值大于0的个数
memset(v, , src->width * );//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->width * 4
memset(h, , src->height * );//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->height * 4 int x, y;//for循环使用
CvScalar s, t;//
/*
CvScalar是一个可以用来存放4个double数值的数组
一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的
如何赋值:
a) 存放单通道图像中像素:cvScalar(255);
b) 存放三通道图像中像素:cvScalar(255,255,255);
c)只使用第一个通道,val[0]=val0;等同于cvScalar(val0,0,0,0);
*/
//遍历,统计每一列有多少个值大于0的像素
for (x = ; x<src->width; x++)
{
for (y = ; y<src->height; y++)
{
s = cvGet2D(src, y, x);//获取指定坐标的像素值
if (s.val[]>)
v[x]++;//当像素值为大于0时,当前列的大于0的像素点加1
}
} //建立垂直投影的图像
for (x = ; x<src->width; x++)
{
for (y = ; y<v[x]; y++)
{
t.val[] = ;
cvSet2D(paintx, y, x, t);//向像素值大于0的坐标赋值为255
}
}
//遍历,统计每一行有多少个值大于0的像素
for (y = ; y<src->height; y++)
{
for (x = ; x<src->width; x++)
{
s = cvGet2D(src, y, x);//获取指定坐标的像素值
if (s.val[]>)
h[y]++;//当像素值为大于0时,当前行的大于0的像素点加1
}
}
//建立水平投影的图像
for (y = ; y<src->height; y++)
{
for (x = ; x<h[y]; x++)
{
t.val[] = ;
cvSet2D(painty, y, x, t);
}
} cvNamedWindow("二值图像", );
cvNamedWindow("垂直积分投影", );
cvNamedWindow("水平积分投影", );
cvShowImage("二值图像", src);
cvShowImage("垂直积分投影", paintx);
cvShowImage("水平积分投影", painty);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&paintx);
cvReleaseImage(&painty);
return ;
}

  运行结果:

  1、灰度图像

  

  2、二值图像

  

  3、垂直积分投影

  

  4、水平积分投影

  

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

  1. 【opencv学习笔记四】opencv3.4.0图形用户接口highgui函数解析

    在笔记二中我们已经知道了,在highgui文件夹下的正是opencv图形用户接口功能结构,我们这篇博客所说的便是D:\Program Files\opencv340\opencv\build\incl ...

  2. OpenCV学习笔记四:ImgProc模块

    一,简介 这个模块包含一系列的常用图像处理算法. 二,分析 此模块包含的文件如下图: 其导出算法包括如下: /*********************** Background statistics ...

  3. opencv学习笔记(四)--图像平滑处理

    图像平滑处理的几种常用方法: 均值滤波 归一化滤波 高斯模糊 中值滤波 平滑处理(模糊)的主要目的是去燥声: 不同的处理方式适合不同的噪声图像,其中高斯模糊最常用. 其实最重要的是对图像卷积的核的理解 ...

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

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  5. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  6. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  7. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  8. opencv学习笔记D01

    目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...

  9. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

随机推荐

  1. 新建的 web 工程 有红色的惊叹号

    新建的 web 工程 有红色的感叹号问题:     在eclipse 中新建一个web工程,但是工程上有红色的感叹号.解决:     1.右键工程,选择Build Path-->Configur ...

  2. 两个大的整数的运算(java)

    import java.math.BigInteger; public class BigInt { BigInteger m1; BigInteger m2; BigInteger m3; BigI ...

  3. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  4. jdbc链接mysql转

    完整java开发中JDBC连接数据库代码和步骤   JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的 ...

  5. tomcat架构

    很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动.这样,这些应用服务器的性能基本上就取决于Tomcat ...

  6. DedeCMS V5.7 Dialog目录下配置文件XSS漏洞

    漏洞地址及证明:/include/dialog/config.php?adminDirHand="/></script><script>alert(1);< ...

  7. 每日构建【Daily Build Using CruiseControl.NET and MSBuild】(转载)

    在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...

  8. word表格断行的问题

    word一个表格如果某一行的 内容 太多,就会自动跑到下一页去了 解决方法是: 在表格上点右键-> 属性 -> "行" -> 去掉"设置行高" ...

  9. DOS中如何删除文件夹

    可以使用rd命令.如果目录是空的,那么可以用 rd 目录删除目录.如下图:输入Y之后系统就会删除整个目录. 如果目录是非空,那么使用rd 目录 /s来删除目录(目录下的文件也会删除一同).如果没有加/ ...

  10. 类型安全且自动管理内存的返回 std::string 的 sprintf 实现

    在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...