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、水平积分投影

  

最新文章

  1. VS 生成事件
  2. npm设计代理
  3. UnitTesting中的ClassInitialize,ClassCleanup,TestInitialize,TestClearup
  4. ASP.NET5 Beta8可用性
  5. jboss eap 6.3 域(Domain)模式配置
  6. 【python】判断字符串日期是否有效
  7. Java Servlet(六):HttpServlet实现原理(jdk7+tomcat7+eclipse)
  8. 微软职位内部推荐-Principal Dev Manager
  9. 相见恨晚——MarkDown
  10. MFC 对话框中动态创建N级菜单以及响应事件
  11. margin:0 auto在ie7浏览器里面无效
  12. Oracle基础学习(二)v$session中Command的数字含义
  13. [补档][Poi2014]FarmCraft
  14. 201521123100 《Java程序设计》 第2周学习总结
  15. SpringMVC RequestMapping 详解
  16. Python自动化--语言基础8--接口请求及封装
  17. 生成1~n的排列
  18. 再谈机器学习中的归一化方法(Normalization Method)
  19. asp.net core系列 27 EF模型配置(索引,备用键,继承)
  20. mysqldump 和mysqlbinlog

热门文章

  1. 如何在 Arch Linux 的终端里设定 WiFi 网络
  2. HDU2196computer(树上最远距离 + DP)
  3. visual studio 2012如何彻底删除TFS上的团队项目
  4. KxMenu下拉菜单
  5. WAF绕过的技巧
  6. 使用guava带来的方便
  7. CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用
  8. 保存知乎收藏夹功能的NodeJS版本
  9. jQuery1.11源码分析(4)-----Sizzle工厂函数[原创]
  10. [Effective JavaScript 笔记]第60条:支持方法链