opencv学习笔记(四)投影
2024-10-16 20:35:31
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、水平积分投影
最新文章
- VS 生成事件
- npm设计代理
- UnitTesting中的ClassInitialize,ClassCleanup,TestInitialize,TestClearup
- ASP.NET5 Beta8可用性
- jboss eap 6.3 域(Domain)模式配置
- 【python】判断字符串日期是否有效
- Java Servlet(六):HttpServlet实现原理(jdk7+tomcat7+eclipse)
- 微软职位内部推荐-Principal Dev Manager
- 相见恨晚——MarkDown
- MFC 对话框中动态创建N级菜单以及响应事件
- margin:0 auto在ie7浏览器里面无效
- Oracle基础学习(二)v$session中Command的数字含义
- [补档][Poi2014]FarmCraft
- 201521123100 《Java程序设计》 第2周学习总结
- SpringMVC RequestMapping 详解
- Python自动化--语言基础8--接口请求及封装
- 生成1~n的排列
- 再谈机器学习中的归一化方法(Normalization Method)
- asp.net core系列 27 EF模型配置(索引,备用键,继承)
- mysqldump 和mysqlbinlog
热门文章
- 如何在 Arch Linux 的终端里设定 WiFi 网络
- HDU2196computer(树上最远距离 + DP)
- visual studio 2012如何彻底删除TFS上的团队项目
- KxMenu下拉菜单
- WAF绕过的技巧
- 使用guava带来的方便
- CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用
- 保存知乎收藏夹功能的NodeJS版本
- jQuery1.11源码分析(4)-----Sizzle工厂函数[原创]
- [Effective JavaScript 笔记]第60条:支持方法链