opencv学习笔记(四)投影

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

 #include <cv.h>
 #include <highgui.h>
 using namespace std;
 using namespace cv;
 int main()
 {
     IplImage * src = cvLoadImage(); //强制转化读取图像为灰度图
     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的像素
     ; x<src->width; x++)
     {
         ; y<src->height; y++)
         {
             s = cvGet2D(src, y, x);//获取指定坐标的像素值
             ]>)
                 v[x]++;//当像素值为大于0时,当前列的大于0的像素点加1
         }
     }

     //建立垂直投影的图像
     ; x<src->width; x++)
     {
         ; y<v[x]; y++)
         {
             t.val[] = ;
             cvSet2D(paintx, y, x, t);//向像素值大于0的坐标赋值为255
         }
     }
     //遍历,统计每一行有多少个值大于0的像素
     ; y<src->height; y++)
     {
         ; x<src->width; x++)
         {
             s = cvGet2D(src, y, x);//获取指定坐标的像素值
             ]>)
                 h[y]++;//当像素值为大于0时,当前行的大于0的像素点加1
         }
     }
     //建立水平投影的图像
     ; y<src->height; y++)
     {
         ; 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);
     ;
 }

  运行结果:

  1、灰度图像

  

  2、二值图像

  

  3、垂直积分投影

  

  4、水平积分投影

  

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

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

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

  2. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  3. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  6. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  7. opencv学习笔记(二)寻找轮廓

    opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...

  8. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  9. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

随机推荐

  1. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  2. 巧妙利用before和after伪类实现文字的展开和收起

    需求:一段文字,当收起的时候,显示4行,并且多余4行的部分用省略号表示,关键是在省略号前面留有空白部分来放一些图标等东西:展开的时候,全部显示. 例如下面的示例图: 收起的时候: 展开的时候: 在不用 ...

  3. 基于Rest服务实现的RPC

    前言:现在RPC成熟的框架已经很多了,比喻Motan和Dubbo,但是今天我这里提供一种基于Rest服务的Rpc.和上一篇连着的http://www.cnblogs.com/LipeiNet/p/58 ...

  4. Tomcat:基于Apache+Tomcat的集群搭建

    根据Tomcat的官方文档说明可以知道,使用Tomcat配置集群需要与其它Web Server配合使用才可以完成,典型的有Apache和IIS. 这里就使用Apache+Tomcat方式来完成基于To ...

  5. Android学习笔记——Button

    该工程的功能是实现在activity中显示一个TextView和一个Button 以下代码是MainActivity中的代码 package com.example.button; import an ...

  6. ODAC (V9.5.15) 学习笔记(二十一)数据复制

    用TVirtualTable在内存中缓存TOraQuery中的数据,主要应用场景是参照其他数据,需要将TOraQuery中的数据复制到TVirtualTable,由于没有类似于TClientDataS ...

  7. Bootstrap新手学习笔记——css

    Css模块: 1.网格系统: class前缀:.col-xs-*,.col-sm-*,.col-md-*,.col-lg-* <div class="container"&g ...

  8. Unity3d与iOS交互开发——接入平台SDK必备技能

    原地址:http://www.2cto.com/kf/201401/273337.html# 前言废话:开发手机游戏都知道,你要接入各种平台的SDK.那就需要Unity3d与iOS中Objective ...

  9. Android Touch事件传递机制解析

    android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...

  10. vmware lan map

    1,nat: virtrual machine---vmnet8---PC---internet 2,host-only virtual machine(0,1,2...)---vmnet1 3,br ...