利用OpenCV计算图像的垂直和水平积分投影
2014-09-16 19:15
417 查看
转自:http://blog.csdn.net/quarryman/article/details/6427886
说明:本文的代码改编自longlongago2000的一篇博文,这是它的链接:http://blog.csdn.net/longlongago2000/archive/2008/07/22/2692565.aspx。本文的测试图像是标准的lena图像。
代码:
[c-sharp]
view plaincopy
#include <cv.h>
#include <highgui.h>
#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.lib" )
int main()
{
IplImage * src=cvLoadImage("lena.jpg",0);
// cvSmooth(src,src,CV_BLUR,3,3,0,0);
cvThreshold(src,src,50,255,CV_THRESH_BINARY_INV);
IplImage* paintx=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
IplImage* painty=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
cvZero(paintx);
cvZero(painty);
int* v=new int[src->width];
int* h=new int[src->height];
memset(v,0,src->width*4);
memset(h,0,src->height*4);
int x,y;
CvScalar s,t;
for(x=0;x<src->width;x++)
{
for(y=0;y<src->height;y++)
{
s=cvGet2D(src,y,x);
if(s.val[0]==0)
v[x]++;
}
}
for(x=0;x<src->width;x++)
{
for(y=0;y<v[x];y++)
{
t.val[0]=255;
cvSet2D(paintx,y,x,t);
}
}
for(y=0;y<src->height;y++)
{
for(x=0;x<src->width;x++)
{
s=cvGet2D(src,y,x);
if(s.val[0]==0)
h[y]++;
}
}
for(y=0;y<src->height;y++)
{
for(x=0;x<h[y];x++)
{
t.val[0]=255;
cvSet2D(painty,y,x,t);
}
}
cvNamedWindow("二值图像",1);
cvNamedWindow("垂直积分投影",1);
cvNamedWindow("水平积分投影",1);
cvShowImage("二值图像",src);
cvShowImage("垂直积分投影",paintx);
cvShowImage("水平积分投影",painty);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&paintx);
cvReleaseImage(&painty);
return 0;
}
下面是代码运行的结果:
![](http://hi.csdn.net/attachment/201105/17/0_1305638741lXhF.gif)
![](http://hi.csdn.net/attachment/201105/17/0_1305638841jt09.gif)
说明:本文的代码改编自longlongago2000的一篇博文,这是它的链接:http://blog.csdn.net/longlongago2000/archive/2008/07/22/2692565.aspx。本文的测试图像是标准的lena图像。
代码:
[c-sharp]
view plaincopy
#include <cv.h>
#include <highgui.h>
#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.lib" )
int main()
{
IplImage * src=cvLoadImage("lena.jpg",0);
// cvSmooth(src,src,CV_BLUR,3,3,0,0);
cvThreshold(src,src,50,255,CV_THRESH_BINARY_INV);
IplImage* paintx=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
IplImage* painty=cvCreateImage( cvGetSize(src),IPL_DEPTH_8U, 1 );
cvZero(paintx);
cvZero(painty);
int* v=new int[src->width];
int* h=new int[src->height];
memset(v,0,src->width*4);
memset(h,0,src->height*4);
int x,y;
CvScalar s,t;
for(x=0;x<src->width;x++)
{
for(y=0;y<src->height;y++)
{
s=cvGet2D(src,y,x);
if(s.val[0]==0)
v[x]++;
}
}
for(x=0;x<src->width;x++)
{
for(y=0;y<v[x];y++)
{
t.val[0]=255;
cvSet2D(paintx,y,x,t);
}
}
for(y=0;y<src->height;y++)
{
for(x=0;x<src->width;x++)
{
s=cvGet2D(src,y,x);
if(s.val[0]==0)
h[y]++;
}
}
for(y=0;y<src->height;y++)
{
for(x=0;x<h[y];x++)
{
t.val[0]=255;
cvSet2D(painty,y,x,t);
}
}
cvNamedWindow("二值图像",1);
cvNamedWindow("垂直积分投影",1);
cvNamedWindow("水平积分投影",1);
cvShowImage("二值图像",src);
cvShowImage("垂直积分投影",paintx);
cvShowImage("水平积分投影",painty);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&paintx);
cvReleaseImage(&painty);
return 0;
}
下面是代码运行的结果:
![](http://hi.csdn.net/attachment/201105/17/0_1305638741lXhF.gif)
![](http://hi.csdn.net/attachment/201105/17/0_1305638841jt09.gif)
![](http://hi.csdn.net/attachment/201105/17/0_1305638895vmPv.gif)
相关文章推荐
- 利用OpenCV计算图像的垂直和水平积分投影
- 利用OpenCV计算图像的垂直和水平积分投影
- 使用OpenCV2.x计算图像的水平和垂直积分投影
- 使用OpenCV2.x计算图像的水平和垂直积分投影
- opencv学习---计算图像的水平积分投影和垂直积分投影
- 【OpenCV】计算图像的水平和垂直积分投影
- opencv学习---计算图像的水平积分投影和垂直积分投影
- 图像的水平与垂直积分投影
- 利用opencv函数计算图像的梯度幅度和梯度方向
- opencv2利用直方图对图像的反投影算法
- 对OpenCV mat进行水平和垂直方向的投影
- OpenCV2.4.13 文本分割(水平垂直,直方图投影)
- OpenCV下三对点计算仿射变换实现图像的水平镜像(翻转)的详细说明和源程序
- 【人脸检测:Haar】利用积分图像法快速计算Haar特征(二)
- OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配
- 【图像处理】利用积分图像法快速计算Haar特征
- 利用opencv函数对图像旋转后,按旋转偏移新计算新的图像外接四边形绘制
- 【Paper】利用积分图像法快速计算Haar特征
- 利用积分图像法快速计算Haar特征