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", ); //强制转化读取图像为灰度图
  8. cvShowImage("灰度图像", src);
  9. cvThreshold(src, src, , , CV_THRESH_OTSU + CV_THRESH_BINARY);//大于0取255,否则取0
  10. IplImage* paintx = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );//用于垂直投影的图像(单通道)
  11. IplImage* painty = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );//用于水平投影的图像(单通道)
  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, , src->width * );//为新申请的内存做初始化工作,初始化为0,int占4个字节,所以块的大小为src->width * 4
  17. memset(h, , src->height * );//为新申请的内存做初始化工作,初始化为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 = ; x<src->width; x++)
  31. {
  32. for (y = ; y<src->height; y++)
  33. {
  34. s = cvGet2D(src, y, x);//获取指定坐标的像素值
  35. if (s.val[]>)
  36. v[x]++;//当像素值为大于0时,当前列的大于0的像素点加1
  37. }
  38. }
  39.  
  40. //建立垂直投影的图像
  41. for (x = ; x<src->width; x++)
  42. {
  43. for (y = ; y<v[x]; y++)
  44. {
  45. t.val[] = ;
  46. cvSet2D(paintx, y, x, t);//向像素值大于0的坐标赋值为255
  47. }
  48. }
  49. //遍历,统计每一行有多少个值大于0的像素
  50. for (y = ; y<src->height; y++)
  51. {
  52. for (x = ; x<src->width; x++)
  53. {
  54. s = cvGet2D(src, y, x);//获取指定坐标的像素值
  55. if (s.val[]>)
  56. h[y]++;//当像素值为大于0时,当前行的大于0的像素点加1
  57. }
  58. }
  59. //建立水平投影的图像
  60. for (y = ; y<src->height; y++)
  61. {
  62. for (x = ; x<h[y]; x++)
  63. {
  64. t.val[] = ;
  65. cvSet2D(painty, y, x, t);
  66. }
  67. }
  68.  
  69. cvNamedWindow("二值图像", );
  70. cvNamedWindow("垂直积分投影", );
  71. cvNamedWindow("水平积分投影", );
  72. cvShowImage("二值图像", src);
  73. cvShowImage("垂直积分投影", paintx);
  74. cvShowImage("水平积分投影", painty);
  75. cvWaitKey();
  76. cvDestroyAllWindows();
  77. cvReleaseImage(&src);
  78. cvReleaseImage(&paintx);
  79. cvReleaseImage(&painty);
  80. return ;
  81. }

  运行结果:

  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. -----------------------------------项目中整理的非常有用的PHP函数库(二)-----------------------------------------------------

    6.PHP列出目录下的文件名 如果你想列出目录下的所有文件,使用以下代码即可: function listDirFiles($DirPath){ if($dir = opendir($DirPath) ...

  2. PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载   中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...

  3. yii 10.16

    什么是框架? a)         框架就是一个半成品,一个帮助我们完成业务流程的程序 b)        框架融合了很多的功能,但是不会给我们具体功能模块 c)         我们需要在框架的基础 ...

  4. 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)

    I think: 给出k(4≤k≤5000)个互不相同的整数组成的序列Ni,判断是否存在4个整数Np.Nq.Nr和Ns(1≤p<q<r<s≤k),使得Nq>Ns>Np&g ...

  5. 锋利的jQuery-2--判断jQuery获取到的对象是否存在$().length

    1.使用js获取不存在的对象: document.getElementById("tt").style.color = "red"; 如果网页中不存在id = ...

  6. linux ftp命令(转)

    此命令需要安装ftp, yum install ftp 1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 ...

  7. JAVA 利用JNI加密class文件/自定义ClassLoader 类

    利用 JNI 对bytecode 加密.不影响java程序员的正常开发.09年的时候写的,现在拿出来晒晒————————————————————————————混淆才是王道,如果混淆再加密就更酷了.. ...

  8. jquery json ajax -2

    如果使用的是虚拟空间, 那么你不能操纵/配置服务器上的php.ini配置文件 但是可以在自己的php文件中, 通过ini_set(...), 和一些对应的函数, 去重置(临时的,仅在当前文件中生效的) ...

  9. 繁华模拟赛 ljw分雕塑

    /* 用f[i][k]表示考虑到第i个雕塑,分成k组,可不可行(这是一个bool类型的数组) 转移: f[i][k]=f[j][k-1],sum[i]-sum[j]合法 */ #include < ...

  10. 基于Redis的短链接设计思路

    [Markdown阅读][1] 今天上班的时候收到一个需要短链接的需求,之前的做法都是使用了新浪的短链接API(https://api.weibo.com/2/short_url/shorten.js ...