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. Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映

    前言: 如果你已经厌倦了使用PPT设置路径.设置时间.设置动画方式来制作动画特效.那么Impress.js将是你一个非常好的选择. 用它制作的PPT将更加直观.效果也是嗷嗷美观的. 当然,如果用它来装 ...

  2. DataGrid控件使用

    应用Binding显示后台数据 <UserControl x:Class="demo03.View.UserInfoList"             xmlns=" ...

  3. 复习sql第三次

    1.层次型数据库以"树"结构表示数据库中数据间的关系:网状型以"图"结构表示数据库中数据间的关系:关系型数据库以"二维表"结构表示数据库中数 ...

  4. HDU 1072 Nightmare

    Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on ...

  5. CentOS minimal网络设置

    CentOS minimal版本默认不启动网络,所以要自己配置. 配置过程: 编辑配置文件: vi /etc/sysconfig/network-script/ifcfg-eth0 需要更改两项 NM ...

  6. First Day

    以后这里将记录我的成长脚步啦~~ 欢迎吐槽 作为一个大三即将面临找工作的学渣,心中真的很焦急 要好好学前端!! Fighting~

  7. SVN错误:run &#39;cleanup&#39; if it was interrupted的解决

    原文转自:http://www.lxway.com/812960411.htm 今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not fi ...

  8. session失效后跳转到登陆页面

    一.编写Filter拦截器类 package com.pv.utils; import java.io.IOException; import java.io.PrintWriter; import ...

  9. hdu 5800 To My Girlfriend + dp

    传送门:hdu 5800 To My Girlfriend 题意:给定n个物品,其中i,j必选,l,m必不选,问组成体积为s的方法一共有多少种 思路:定义dp[i][j][s1][s2],表示前i种物 ...

  10. git服务器搭建-new

    http://blog.chinaunix.net/uid-26729093-id-4652536.html 基本命令使用:http://www.cnblogs.com/xdao/p/linux_gi ...