OpenCV例程汇总详细_第1页
OpenCV例程汇总详细_第2页
OpenCV例程汇总详细_第3页
OpenCV例程汇总详细_第4页
OpenCV例程汇总详细_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OpenCV例程汇总TOC\o"1-3"\h\z\uHYPERLINK\l”_Toc278545472”基于opencv的use摄像头视频采集程序ﻩPAGEREF_Toc278545472\h1HYPERLINK\l”_Toc278545473"基于opencv的两个摄像头数据采集ﻩPAGEREF_Toc278545473\h3HYPERLINK\l”_Toc278545474"能激发你用代码做视频的冲动程序 PAGEREF_Toc278545474\h6HYPERLINK图像反转(就是把黑的变白,白的变黑)ﻩPAGEREF_Toc278545475\h11HYPERLINK\l”_Toc278545476"图像格式的转换ﻩPAGEREF_Toc278545476\h12HYPERLINK\l"_Toc278545477"从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测 PAGEREF_Toc278545477\h13HYPERLINK\l"_Toc278545478"采纳Canny算子进行边缘检测 PAGEREF_Toc278545478\h15HYPERLINK\l"_Toc278545479"角点检测ﻩPAGEREF_Toc278545479\h18HYPERLINK\l"_Toc278545480"图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) PAGEREF_Toc278545480\h21HYPERLINKLog—Polar极坐标变换 PAGEREF_Toc278545481\h22HYPERLINK对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算)ﻩPAGEREF_Toc278545482\h24HYPERLINK\l”_Toc278545483"用不同的核进行图像的二维滤波ﻩPAGEREF_Toc278545483\h27HYPERLINK\l”_Toc278545484”图像域的填充 PAGEREF_Toc278545484\h30HYPERLINK\l"_Toc278545485"寻找轮廓实现视频流的运动目标检测(超推举一下)ﻩPAGEREF_Toc278545485\h35HYPERLINK\l"_Toc278545486"采纳金字塔方法进行图像分割ﻩPAGEREF_Toc278545486\h40HYPERLINK\l”_Toc278545487"图像的亮度变换 PAGEREF_Toc278545487\h43HYPERLINK\l"_Toc278545488”单通道图像的直方图ﻩPAGEREF_Toc278545488\h46HYPERLINK\l”_Toc278545489"计算和显示彩色图像的二维色调-饱和度图像ﻩPAGEREF_Toc278545489\h48HYPERLINK\l”_Toc278545490"图像的直方图均匀化 PAGEREF_Toc278545490\h50HYPERLINK\l"_Toc278545491"用Hongh变换检测线段 PAGEREF_Toc278545491\h52HYPERLINK\l”_Toc278545492”利用Hough变换检测圆(是圆不是椭圆)ﻩPAGEREF_Toc278545492\h57HYPERLINK\l"_Toc278545493"距离变换ﻩPAGEREF_Toc278545493\h59HYPERLINK\l”_Toc278545494"椭圆曲线拟合ﻩPAGEREF_Toc278545494\h64HYPERLINK\l"_Toc278545495"由点集序列或数组创建凸外形ﻩPAGEREF_Toc278545495\h68HYPERLINK\l"_Toc278545496"Delaunay三角形和Voronoi划分的迭代式构造ﻩPAGEREF_Toc278545496\h71HYPERLINK\l"_Toc278545497"利用背景建模检测运动物体(推举)ﻩPAGEREF_Toc278545497\h78HYPERLINK\l"_Toc278545498"运动模板检测(摄像头)ﻩPAGEREF_Toc278545498\h81HYPERLINK\l"_Toc278545499”显示如何利用Camshift算法进行彩色目标的跟踪ﻩPAGEREF_Toc278545499\h86基于opencv的use摄像头视频采集程序筹备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,似乎我前面的文章有说过,不懂也可百度一下。建立一个基于WIN32掌握台的工程CameraUSB,在新建一个c++元文件,写代码:#include”cxcore.h"ﻫ#include"cvcam.h"ﻫ#include"windows.h"

#include”highgui。h”voidcallback(IplImage*image);ﻫintmain()ﻫ{ﻫintncams=cvcamGetCamerasCount();//返回可以访问的摄像头数目

HWNDMyWin;

//设置系统属性ﻫcvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE);//选择第一个摄像头

ﻫ//cameraﻫ

cvcamSetProperty(0,CVCAM_PROP_RENDER,CVCAMTRUE);//We'llrenderstreamﻫ

//在本例中ﻫ

//假设创建一个窗口,并且窗口的ID是在变量MyWin中定义

//MyWin是窗口HWND的类型ﻫ

MyWin=(HWND)cvGetWindowHandle("CameraUSBwindow");

cvcamSetProperty(0,CVCAM_PROP_WINDOW,&MyWin);

//Selectsawindowforﻫ

//videorenderingﻫ//回调函数将处理每一帧ﻫcvcamSetProperty(0,CVCAM_PROP_CALLBACK,callback);ﻫ

cvcamInit();ﻫ

cvcamStart();ﻫ

//现在程序开头工作ﻫ

cvWaitKey(0);ﻫ

cvcamStop();ﻫ

cvcamExit();ﻫ

return0;ﻫ}//在图像中画兰色水平线

voidcallback(IplImage*image)ﻫ{ﻫ

IplImage*image1=image;ﻫ

inti,j;ﻫ

assert(image);ﻫ

for(i=0;i<image1->height;i+=10)

{ﻫ

for(j=(image1—〉widthStep)*i;j<(image1-〉widthStep)*(i+1);ﻫ

j+=image1—>nChannels)ﻫ

image1-〉imageData[j]

=(char)255;ﻫ

image1->imageData[j+1]=0;ﻫ

image1—>imageData[j+2]=0;ﻫ

}ﻫ

}ﻫ}嘿嘿,就这么简洁就完事了。不懂可留言问基于opencv的两个摄像头数据采集实现功能:同时采集两路USB摄像头数据,并显示,具有图片保存功能(点击左键保存图片,并暂停视频;右键连续视频)。步骤就不说了,很简洁,直接放代码了:#include<cvcam。h>ﻫ#include<cv。h〉ﻫ#include〈highgui.h>ﻫ#include”stdio。h"ﻫ#include<windows。h>voidStereoCallback(IplImage*frame1,IplImage*frame2);ﻫvoidonMouse1(intEvent,intx,inty,intflags,void*param);ﻫvoidonMouse2(intEvent,intx,inty,intflags,void*param);IplImage*image1,*image2;char*strleft[4]={"left1。bmp",”left2。bmp","left3.bmp”,"left4。bmp"};

char*strright[4]={"right1。bmp","right2.bmp",”right3.bmp”,"right4。bmp"};voidmain()ﻫ{ﻫ

HWNDCaptureWindow1=0;//不赋值也行ﻫ

HWNDCaptureWindow2=0;//intncams=cvcamGetCamerasCount();//猎取摄像头的个数,在这里可有可无ﻫ//用对话框的形式来选取摄像头ﻫ

int*CameraNumber;ﻫ

intnSelected=cvcamSelectCamera(&CameraNumber);/*//灰色图像ﻫimage1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);

image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);

*///彩色图像ﻫimage1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);

image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);//初始化两个摄像头

cvNamedWindow("cvcam1Window",1);ﻫ

CaptureWindow1=(HWND)cvGetWindowHandle("cvcam1Window");

cvcamSetProperty(CameraNumber[0],CVCAM_PROP_ENABLE,CVCAMTRUE);

cvcamSetProperty(CameraNumber[0],CVCAM_PROP_RENDER,CVCAMTRUE);ﻫ

cvcamSetProperty(CameraNumber[0],CVCAM_PROP_WINDOW,&CaptureWindow1);ﻫ//cvSetMouseCallback("cvcam1Window”,onMouse1,0);ﻫﻫ

cvNamedWindow("cvcam2Window",1);ﻫ

CaptureWindow2=(HWND)cvGetWindowHandle("cvcam2Window");ﻫ

cvcamSetProperty(CameraNumber[1],CVCAM_PROP_ENABLE,CVCAMTRUE);ﻫ

cvcamSetProperty(CameraNumber[1],CVCAM_PROP_RENDER,CVCAMTRUE);ﻫ

cvcamSetProperty(CameraNumber[1],CVCAM_PROP_WINDOW,&CaptureWindow2);

//cvSetMouseCallback("cvcam2Window”,onMouse2,0);//让两个摄像头同步ﻫ

cvcamSetProperty(CameraNumber[0],CVCAM_STEREO_CALLBACK,(void*)&StereoCallback);//启动程序

cvcamInit();ﻫ

cvcamStart();ﻫcvSetMouseCallback("cvcam1Window",onMouse1,0);ﻫcvSetMouseCallback("cvcam2Window",onMouse2,0);

cvWaitKey(0);

cvcamStop();ﻫfree(CameraNumber);ﻫcvcamExit();ﻫ

cvDestroyWindow(”cvcam1Window”);ﻫ

cvDestroyWindow("cvcam2Window");ﻫ}voidStereoCallback(IplImage*frame1,IplImage*frame2)ﻫ{/*

//把图像转换成灰度图并保存到image中

cvCvtColor(frame1,image1,CV_RGB2GRAY);ﻫcvCvtColor(frame2,image2,CV_RGB2GRAY);ﻫ*///拷贝图像到全局变量image中该函数这样用存在问题ﻫ//cvCopy(frame1,image1);

//cvCopy(frame2,image2);ﻫimage1=cvCloneImage(frame1);

image2=cvCloneImage(frame2);ﻫ//对截取的图像翻转ﻫcvFlip(image1,image1,0);ﻫcvFlip(image2,image2,0);}ﻫvoidonMouse1(intEvent,intx,inty,intflags,void*param)ﻫ{ﻫﻫstaticintnum=0;ﻫ

if(Event==CV_EVENT_LBUTTONDOWN)

{ﻫ

if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原ﻫ

cvcamPause();ﻫ

//图像保存

cvSaveImage(strleft[num],image1);ﻫ//cvSaveImage(strright[num],image2);ﻫ

//cvSaveImage(”left.bmp",image1);ﻫ

//cvSaveImage(”right.bmp”,image2);

}ﻫ

if(Event==CV_EVENT_RBUTTONDOWN)ﻫ

{ﻫ

cvcamResume();ﻫ

num++;

}ﻫ

ﻫ}voidonMouse2(intEvent,intx,inty,intflags,void*param)ﻫ{ﻫﻫstaticintnum=0;ﻫ

if(Event==CV_EVENT_LBUTTONDOWN)ﻫ

{ﻫ

if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原ﻫ

cvcamPause();ﻫ

//图像保存

//

cvSaveImage(strleft[num],image1);ﻫ

cvSaveImage(strright[num],image2);ﻫ

//cvSaveImage("left.bmp",image1);ﻫ

//cvSaveImage("right.bmp",image2);

}ﻫ

if(Event==CV_EVENT_RBUTTONDOWN)ﻫ

{ﻫ

cvcamResume();ﻫ

num++;ﻫ

ﻫ}能激发你用代码做视频的冲动程序这个程序是基于opencv的,连接库就不说了,直接建立一个基于win32的掌握台程序,写代码就OK了。/*程序名:drawing..cﻫ功能:展现OpenCV的图像绘制功能

*/ﻫ#include"cv.h”ﻫ#include"highgui。h”ﻫ#include〈stdlib.h>

#include<stdio.h>ﻫ#defineNUMBER100

#defineDELAY5ﻫcharwndname[]="DrawingDemo";CvScalarrandom_color(CvRNG*rng)//函数cvRNG初始化随机数生成器并返回其状态,RNG随机数生成器ﻫ{

inticolor=cvRandInt(rng);//函数cvRandInt返回均匀分布的随机32-bit无符号整型值并更新RNG状态ﻫ

returnCV_RGB(icolor&255,(icolor>〉8)&255,(icolor>>16)&255);//创建一个颜色值

}intmain(intargc,char**argv)

{ﻫ

intline_type=CV_AA;//changeitto8toseenon—antialiasedgraphicsﻫ

inti;ﻫ

CvPointpt1,pt2;//基于二维整形坐标轴的点ﻫ

doubleangle;

CvSizesz;

//矩形框大小,以像素为精度ﻫ

CvPointptt[6];ﻫ

CvPoint*pt[2];ﻫ

intarr[2];ﻫ

CvFontfont;ﻫ

CvRNGrng;ﻫ

intwidth=1000,height=700;ﻫ

intwidth3=width*3,height3=height*3;ﻫ

CvSizetext_size;

intymin=0;

//Loadthesourceimageﻫ

IplImage*image=cvCreateImage(cvSize(width,height),8,3);ﻫ

IplImage*image2;

//Createawindow

cvNamedWindow(wndname,1);ﻫ

cvZero(image);//#definecvZerocvSetZero

voidcvSetZero(CvArr*arr);arr要被清空数组ﻫ

cvShowImage(wndname,image);

rng=cvRNG((unsigned)—1);

pt[0]=&(ptt[0]);ﻫ

pt[1]=&(ptt[3]);

arr[0]=3;

arr[1]=3;

for(i=0;i<NUMBER;i++)

{ﻫ

pt1.x=cvRandInt(&rng)%width3—width;ﻫ

pt1.y=cvRandInt(&rng)%height3—height;

pt2.x=cvRandInt(&rng)%width3-width;ﻫ

pt2。y=cvRandInt(&rng)%height3-height;

cvLine(image,pt1,pt2,random_color(&rng),cvRandInt(&rng)%10,line_type,0);//绘制连接两个点的线段ﻫ

cvShowImage(wndname,image);ﻫ

cvWaitKey(DELAY);ﻫ

}

for(i=0;i<NUMBER;i++)ﻫ

{ﻫ

pt1.x=cvRandInt(&rng)%width3-width;ﻫ

pt1.y=cvRandInt(&rng)%height3—height;ﻫ

pt2。x=cvRandInt(&rng)%width3-width;

pt2.y=cvRandInt(&rng)%height3—height;

cvRectangle(image,pt1,pt2,random_color(&rng),cvRandInt(&rng)%10-1,line_type,0);//绘制简洁、指定粗细或者带填充的矩形ﻫ

cvShowImage(wndname,image);ﻫ

cvWaitKey(DELAY);ﻫ

for(i=0;i<NUMBER;i++)ﻫ

pt1.x=cvRandInt(&rng)%width3-width;

pt1。y=cvRandInt(&rng)%height3—height;ﻫ

sz.width=cvRandInt(&rng)%200;ﻫ

sz。height=cvRandInt(&rng)%200;ﻫ

angle=(cvRandInt(&rng)%1000)*0.180;

cvEllipse(image,pt1,sz,angle,angle-100,angle+200,

random_color(&rng),cvRandInt(&rng)%10-1,line_type,0);//函数cvEllipse用来绘制或者填充一个简洁的椭圆弧或椭圆扇形

cvShowImage(wndname,image);ﻫ

cvWaitKey(DELAY);

}

for(i=0;i〈NUMBER;i++)ﻫ

{ﻫ

pt[0][0]。x=cvRandInt(&rng)%width3—width;

pt[0][0].y=cvRandInt(&rng)%height3-height;ﻫ

pt[0][1]。x=cvRandInt(&rng)%width3-width;ﻫ

pt[0][1].y=cvRandInt(&rng)%height3-height;ﻫ

pt[0][2].x=cvRandInt(&rng)%width3-width;ﻫ

pt[0][2].y=cvRandInt(&rng)%height3-height;ﻫ

pt[1][0].x=cvRandInt(&rng)%width3-width;ﻫ

pt[1][0].y=cvRandInt(&rng)%height3-height;ﻫ

pt[1][1]。x=cvRandInt(&rng)%width3-width;ﻫ

pt[1][1].y=cvRandInt(&rng)%height3-height;ﻫ

pt[1][2].x=cvRandInt(&rng)%width3-width;ﻫ

pt[1][2].y=cvRandInt(&rng)%height3—height;

cvPolyLine(image,pt,arr,2,1,random_color(&rng),cvRandInt(&rng)%10,line_type,0);//函数cvPolyLine绘制一个简洁的或多样的多角曲线ﻫ

cvShowImage(wndname,image);ﻫ

cvWaitKey(DELAY);

for(i=0;i<NUMBER;i++)

{ﻫ

pt[0][0]。x=cvRandInt(&rng)%width3-width;ﻫ

pt[0][0].y=cvRandInt(&rng)%height3—height;ﻫ

pt[0][1].x=cvRandInt(&rng)%width3-width;ﻫ

pt[0][1]。y=cvRandInt(&rng)%height3-height;ﻫ

pt[0][2]。x=cvRandInt(&rng)%width3—width;ﻫ

pt[0][2]。y=cvRandInt(&rng)%height3—height;ﻫ

pt[1][0]。x=cvRandInt(&rng)%width3-width;ﻫ

pt[1][0].y=cvRandInt(&rng)%height3-height;ﻫ

pt[1][1]。x=cvRandInt(&rng)%width3—width;

pt[1][1]。y=cvRandInt(&rng)%height3-height;

pt[1][2]。x=cvRandInt(&rng)%width3-width;

pt[1][2]。y=cvRandInt(&rng)%height3-height;

cvFillPoly(image,pt,arr,2,random_color(&rng),line_type,0);//函数cvFillPoly用于一个单独被多变形轮廓所限定的区域内进行填充ﻫ

cvShowImage(wndname,image);

cvWaitKey(DELAY);ﻫ

for(i=0;i〈NUMBER;i++)

{ﻫ

pt1.x=cvRandInt(&rng)%width3-width;ﻫ

pt1.y=cvRandInt(&rng)%height3—height;

cvCircle(image,pt1,cvRandInt(&rng)%300,random_color(&rng),ﻫ

cvRandInt(&rng)%10-1,line_type,0);//函数cvCircle绘制或填充一个给定圆心和半径的圆

cvShowImage(wndname,image);

cvWaitKey(DELAY);ﻫ

}

for(i=1;i<NUMBER;i++)ﻫ

{ﻫ

pt1.x=cvRandInt(&rng)%width3-width;ﻫ

pt1。y=cvRandInt(&rng)%height3—height;

cvInitFont(&font,cvRandInt(&rng)%8,ﻫ(cvRandInt(&rng)%100)*0.05+0。1,ﻫ(cvRandInt(&rng)%100)*0。05+0.1,

(cvRandInt(&rng)%5)*0.1,cvRound(cvRandInt(&rng)%10),ﻫline_type);//字体结构初始化。函数cvRound,cvFloor,cvCeil用一种舍入方法将输入浮点数转换成整数。cvRound返回和参数最接近的整数值

cvPutText(image,"NortheastPetroleumUniversity!",pt1,&font,random_color(&rng));//在图像中加入文本ﻫ

cvShowImage(wndname,image);

cvWaitKey(DELAY);ﻫ

}

cvInitFont(&font,CV_FONT_HERSHEY_COMPLEX,3,3,0.0,5,line_type);

cvGetTextSize(”Opencvforever!”,&font,&text_size,&ymin);//设置字符串文本的宽度和高度

pt1.x=(width—text_size。width)/2;ﻫ

pt1。y=(height+text_size.height)/2;ﻫ

image2=cvCloneImage(image);

for(i=0;i〈255;i++)

cvSubS(image2,cvScalarAll(i),image,0);//函数cvSubS从原数组的每个元素中减去一个数量ﻫ

cvPutText(image,"shentuhongfeng

forever!",pt1,&font,CV_RGB(255,i,i));ﻫ

cvShowImage(wndname,image);ﻫ

cvWaitKey(DELAY);ﻫ

}

//Waitforakeystroke;thesamefunctionarrangeseventsprocessing

cvWaitKey(0);ﻫ

cvReleaseImage(&image);ﻫ

cvReleaseImage(&image2);ﻫ

cvDestroyWindow(wndname);return0;ﻫ}效果图:太帅了图像反转(就是把黑的变白,白的变黑)黑的变白了,白的变黑了源码:#include<stdio。h>ﻫ#include<math。h>ﻫ#include<cv。h>ﻫ#include<highgui.h>intmain(intargc,char*argv[])ﻫ{ﻫIplImage*img=0;ﻫintheight,width,step,channels;ﻫUCHAR*data;ﻫinti,j,k;

if(argc〈2)

{

printf(”Usage:InvImage<image—file—name〉\n\7”);ﻫ

exit(0);ﻫ}ﻫimg=cvLoadImage(argv[1]);

if(!img)ﻫ{

printf("Couldnotloadimagefile:%s\n",argv[1]);

exit(0);

height=img—>height;ﻫwidth=img->width;ﻫstep=img—>widthStep;ﻫchannels=img->nChannels;

data=(UCHAR*)img->imageData;ﻫprintf("Processinga%d*%dimagewith%dchannels\n”,height,width,channels);

ﻫcvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);

cvMoveWindow(”mainWin",100,100);for(i=0;i〈height;i++)

for(j=0;j<width;j++)ﻫ

for(k=0;k〈channels;k++)

data[i*step+j*channels+k]=255—data[i*step+j*channels+k];ﻫﻫcvShowImage("mainWin",img);

cvWaitKey(0);ﻫcvReleaseImage(&img);ﻫreturn0;

}图像格式的转换首先要筹备一张图片,和几个txt文档,把txt文档的扩展名改成一个你要把图片转换成的格式我用的原始图片是jpg的,txt改成bmp的使用时,运行-cmd—cd转到你的名目—Convert.exe1。jpg2.bmp运行就能把图像1.jpg转换成2.bmp了源码如下:/*程序名:convert。cﻫ功能:图像格式的转换ﻫ*/ﻫ#include<cv.h〉

#include<highgui.h>ﻫ#include<stdio.h>

intmain(intargc,char**argv)ﻫ{ﻫIplImage*src;ﻫﻫ//-1:theloadedimagewillbeloadedasis(withnumberofchannelsdependsonthefile)。

if(argc!=3)ﻫ{ﻫ

printf(”CONV:Imageformatconvertion,supportJPG,BMP,TIF,PNG,PPM\n");

printf("Usage:convsrcImagedstImage\n");ﻫ

return0;ﻫ}ﻫif((strstr(argv[1],".jpg")==NULL

&&strstr(argv[1],"。bmp”)==NULL

&&strstr(argv[1],".tif")==NULLﻫ&&strstr(argv[1],".png”)==NULLﻫ&&strstr(argv[1],”。ppm”)==NULL)ﻫ

||(strstr(argv[2],"。jpg”)==NULLﻫ&&strstr(argv[2],”.bmp”)==NULL

&&strstr(argv[2],"。tif")==NULLﻫ&&strstr(argv[2],".png”)==NULL

&&strstr(argv[2],”.ppm")==NULL))//strstr(a,b)的用法是不是在a数组内查看是否有b数组.。。没有则输出NULLﻫ{ﻫ

printf("WARNING:CONVonlysupportJPG,BMP,TIF,PPM,TGAandPPM\n");ﻫ

}ﻫelse{ﻫif((src=cvLoadImage(argv[1],-1))!=0){ﻫ

cvSaveImage(argv[2],src);ﻫ

cvReleaseImage(&src);

printf("\nConvertsuccessfully.\n");ﻫ

elseﻫ

{ﻫ

printf("\n***Readorwriteimagefails***\n");

}ﻫ}ﻫreturn0;ﻫ}发现了个小问题:原来的jpg图像只有102KB转换成bmp后变成549KB,在运行程序把这个bmp转成jpg又只有81KB。这真是汗死我了从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测/*ﻫ程序名称:laplace.c

功能:从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。ﻫ*/ﻫ#include"cv.h"ﻫ#include”highgui.h”ﻫ#include〈ctype.h>ﻫ#include〈stdio.h>intmain(intargc,char**argv)ﻫ{ﻫ

IplImage*laplace=0;ﻫ

IplImage*colorlaplace=0;ﻫ

IplImage*planes[3]={0,0,0};//多个图像面ﻫ

CvCapture*capture=0;

//下面的语句说明在命令行执行程序时,如果指定AVI文件,那么处理从ﻫ//AVI文件读取的视频流,如果不指定输入变量,那么处理从摄像头猎取ﻫ//的视频流ﻫif(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))ﻫ

capture=cvCaptureFromCAM(argc==2?argv[1][0]—’0':0);ﻫ

elseif(argc==2)ﻫ

capture=cvCaptureFromAVI(argv[1]);

if(!capture)ﻫ

{ﻫ

fprintf(stderr,”Couldnotinitializecapturing。..\n");ﻫ

return-1;ﻫ

cvNamedWindow("Laplacian”,0);//循环捕获,直到用户按键跳出循环体ﻫ

for(;;)ﻫ

{ﻫ

IplImage*frame=0;ﻫ

inti;

frame=cvQueryFrame(capture);ﻫ

if(!frame)ﻫ

break;

if(!laplace)

{ﻫ

for(i=0;i〈3;i++)ﻫ

planes[i]=cvCreateImage(cvSize(frame—>width,frame->height),8,1);ﻫlaplace=cvCreateImage(cvSize(frame->width,frame—>height),ﻫIPL_DEPTH_16S,1);

colorlaplace=cvCreateImage(cvSize(frame—>width,frame->height),8,3);ﻫ

}ﻫ

cvCvtPixToPlane(frame,planes[0],planes[1],planes[2],0);ﻫ

for(i=0;i<3;i++)ﻫ

{ﻫ

cvLaplace(planes[i],laplace,3);//3:aperture_size

cvConvertScaleAbs(laplace,planes[i],1,0);//planes[]=ABS(laplace)

cvCvtPlaneToPix(planes[0],planes[1],planes[2],0,colorlaplace);ﻫ

colorlaplace-〉origin=frame—>origin;

cvShowImage("Laplacian",colorlaplace);

if(cvWaitKey(10)〉=0)ﻫ

break;

}ﻫ

cvReleaseCapture(&capture);ﻫ

cvDestroyWindow(”Laplacian");ﻫ

return0;

}采纳Canny算子进行边缘检测#include"cv。h”ﻫ#include"highgui。h”charwndname[]="Edge”;ﻫchartbarname[]="Threshold";ﻫintedge_thresh=1;IplImage*image=0,*cedge=0,*gray=0,*edge=0;//定义跟踪条的callback函数ﻫvoidon_trackbar(inth)ﻫ{ﻫ

cvSmooth(gray,edge,CV_BLUR,3,3,0);ﻫ

cvNot(gray,edge);

//对灰度图像进行边缘检测ﻫ

cvCanny(gray,edge,(float)edge_thresh,(float)edge_thresh*3,3);ﻫ

cvZero(cedge);ﻫ

//copyedgepointsﻫ

cvCopy(image,cedge,edge);

//显示图像ﻫ

cvShowImage(wndname,cedge);ﻫ}intmain(intargc,char**argv)

{

char*filename=argc==2?argv[1]:(char*)"fruits.jpg”;ﻫ

if((image=cvLoadImage(filename,1))==0)

return-1;

//Createtheoutputimageﻫ

cedge=cvCreateImage(cvSize(image->width,image—〉height),IPL_DEPTH_8U,3);

//将彩色图像转换为灰度图像ﻫ

gray=cvCreateImage(cvSize(image->width,image-〉height),IPL_DEPTH_8U,1);ﻫ

edge=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);ﻫ

cvCvtColor(image,gray,CV_BGR2GRAY);

//Createawindow

cvNamedWindow(wndname,1);

//createatoolbarﻫ

cvCreateTrackbar(tbarname,wndname,&edge_thresh,100,on_trackbar);

//Showtheimageﻫ

on_trackbar(1);

//Waitforakeystroke;thesamefunctionarrangeseventsprocessingﻫ

cvWaitKey(0);

cvReleaseImage(&image);

cvReleaseImage(&gray);

cvReleaseImage(&edge);ﻫ

cvDestroyWindow(wndname);

return0;ﻫ}ﻫ/*******代码中的函数说明

1、cvSmooth,其函数声明为:ﻫcvSmooth(constvoid*srcarr,void*dstarr,intsmoothtype,intparam1,intparam2,doubleparam3)ﻫcvSmooth函数的作用是对图象做各种方法的图象平滑。其中,srcarr为输入图象;dstarr为输出图象;ﻫparam1为平滑操作的第一个参数;param2为平滑操作的其次个参数(如果param2值为0,则表示它被设为param1);ﻫparam3是对应高斯参数的标准差。ﻫ参数smoothtype是图象平滑的方法选择,主要的平滑方法有以下五种:ﻫCV_BLUR_NO_SCALE:简洁不带尺度变换的模糊,即对每个象素在param1×param2领域求和。

CV_BLUR:对每个象素在param1×param2邻域求和并做尺度变换1/(param1?param2)。ﻫCV_GAUSSIAN:对图像进行核大小为param1×param2的高斯卷积。ﻫCV_MEDIAN:对图像进行核大小为param1×param1的中值滤波(邻域必须是方的).ﻫCV_BILATERAL:双向滤波,应用双向3x3滤波,彩色设置为param1,空间设置为param2。2、voidcvNot(constCvArr*src,CvArr*dst);ﻫ函数cvNot()会将src中的每一个元素的每一位取反,然后把结果赋给dst。ﻫ因此,一个值为0x00的8位图像将被映射到0xff,而值为0x83的图像将被映射到0x7c。3、voidcvCanny(constCvArr*image,CvArr*edges,doublethreshold1,doublethreshold2,intaperture_size=3);ﻫ采纳Canny算法做边缘检测ﻫimageﻫ输入图像ﻫedges

输出的边缘图像ﻫthreshold1ﻫ第一个阈值

threshold2ﻫ其次个阈值ﻫaperture_sizeﻫSobel算子内核大小4、voidcvCopy(constCvArr*src,CvArr*dst,constCvArr*mask=NULL);

在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。ﻫcvCopy会把src中的数据复制到dst的内存中。5、cvCreateTrackbar

创建trackbar并将它添加到指定的窗口.ﻫintcvCreateTrackbar(constchar*trackbar_name,constchar*window_name,ﻫint*value,intcount,CvTrackbarCallbackon_change);ﻫtrackbar_name

被创建的trackbar名字。ﻫwindow_nameﻫ窗口名字,这个窗口将为被创建trackbar的父对象.ﻫvalueﻫ整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置.ﻫcount

滑块位置的最大值。最小值始终是0。ﻫon_change

每次滑块位置被转变的时候,被调用函数的指针。这个函数应该被声明为voidFoo(int);ﻫ如果没有回调函数,这个值可以设为NULL.ﻫ函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围掌握),指定与trackbar位置同步的变量,

并且指定当trackbar位置被转变的时候调用的回调函数。被创建的trackbar显示在指定窗口的顶端。

*/角点检测原始图:处理后图:源代码:#include〈stdio。h>ﻫ#include"cv.h”ﻫ#include"highgui。h”ﻫ#definemax_corners100intmain(intargc,char**argv)ﻫ{ﻫ

intcornerCount=max_corners;ﻫ

CvPoint2D32fcorners[max_corners];ﻫ

IplImage*srcImage=0,*grayImage=0,*corners1=0,*corners2=0;ﻫ

inti;ﻫ

CvScalarcolor=CV_RGB(255,0,0);ﻫ

char*filename=argc==2?argv[1]:(char*)"pic3.png";//注意相对路径ﻫ

cvNamedWindow(”image”,1);//createHighGUIwindowwithname”image”

//Loadtheimagetobeprocessed

srcImage=cvLoadImage(filename,1);ﻫ

grayImage=cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);ﻫ

//copythesourceimagetocopyimageafterconvertingtheformatﻫ

cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);

//createemptyimagesofsamesizeasthecopiedimagesﻫ

corners1=cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);

corners2=cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);ﻫ

cvGoodFeaturesToTrack(grayImage,corners1,

corners2,corners,ﻫ

&cornerCount,0.05,ﻫ

5,ﻫ

0,ﻫ

3,//blocksizeﻫ

0,//notuseharris

0.4);

printf("numcornersfound:%d\n",cornerCount);ﻫ

//drawcirclesateachcornerlocationinthegrayimageandﻫ

//printoutalistthecorners

if(cornerCount>0)ﻫ

{ﻫ

for(i=0;i<cornerCount;i++)ﻫ

{ﻫ

cvCircle(srcImage,cvPoint((int)(corners[i]。x),(int)(corners[i].y)),6,

color,2,CV_AA,0);ﻫ

}ﻫ

}ﻫ

cvShowImage(”image",srcImage);ﻫ

cvReleaseImage(&srcImage);ﻫ

cvReleaseImage(&grayImage);

cvReleaseImage(&corners1);ﻫ

cvReleaseImage(&corners2);

cvWaitKey(0);//waitforkey.Thefunctionhasﻫ

return0;

}友情链接一下,这是别人写的:HYPERLINK"http://hi.baidu。com/xiaoduo170/blog/item/2816460175c8330779ec2c64.html"http://hi.baidu.com/xiaoduo170/blog/item/2816460175c8330779ec2c64。html图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的)#include"cv.h"ﻫ#include"highgui。h”ﻫ#include"math.h”ﻫintmain(intargc,char**argv)ﻫ{ﻫIplImage*src;ﻫ/*themandlineparametermustbeimagefilename*/

if(argc==2&&(src=cvLoadImage(argv[1],—1))!=0)ﻫ{ﻫ

IplImage*dst=cvCloneImage(src);ﻫ

intdelta=1;ﻫ

intangle=0;ﻫ

intopt=1;

//1:旋转加缩放ﻫ

//0:仅仅旋转

doublefactor;ﻫ

cvNamedWindow("src",1);ﻫ

cvShowImage("src",src);

for(;;)ﻫ

{ﻫ

floatm[6];

//Matrixmlookslike:ﻫ

//

//[m0m1m2]===>[A11A12

b1]ﻫ

//[m3m4m5]

[A21A22

b2]ﻫ

//ﻫ

CvMatM=cvMat(2,3,CV_32F,m);ﻫ

intw=src->width;ﻫ

inth=src-〉height;ﻫ

if(opt)//旋转加缩放ﻫ

factor=(cos(angle*CV_PI/180。)+1.05)*2;ﻫ

else//仅仅旋转ﻫ

factor=1;ﻫ

m[0]=(float)(factor*cos(-angle*2*CV_PI/180.));ﻫ

m[1]=(float)(factor*sin(-angle*2*CV_PI/180。));ﻫ

m[3]=—m[1];ﻫ

m[4]=m[0];ﻫ

//将旋转中心移至图像中间ﻫ

m[2]=w*0.5f;ﻫ

m[5]=h*0.5f;

//dst(x,y)=A*src(x,y)+bﻫ

cvGetQuadrangleSubPix(src,dst,&M);//提取象素四边形,使用子象素精度ﻫ

cvNamedWindow(”dst",1);ﻫ

cvShowImage(”dst",dst);

if(cvWaitKey(5)==27)

break;ﻫ

angle=(int)(angle+delta)%360;

}//for-loop

return0;ﻫ}Log-Polar极坐标变换原始图:效果图:(正变换)反变换:ﻫﻫ正反变换只是函数中一个参数的不同,简略看你所需要的应用。cvLogPolar函数可以用来模拟人类的中央视觉(fovealvision),并可以用于物体跟踪方面的尺度及旋转不变模板的快速匹配.源代码:#include〈cv.h〉

#include〈highgui.h〉intmain(intargc,char**argv)ﻫ{ﻫ

IplImage*src;

if(argc==2&&(src=cvLoadImage(argv[1],1))!=0)ﻫ

{ﻫ

IplImage*dst=cvCreateImage(cvSize(256,256),8,3);

IplImage*src2=cvCreateImage(cvGetSize(src),8,3);ﻫ

cvLogPolar(src,dst,cvPoint2D32f(src->width/2,src—〉height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);ﻫ

cvLogPolar(dst,src2,cvPoint2D32f(src—〉width/2,src->height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP);

cvNamedWindow("log-polar",1);ﻫ

cvShowImage("log-polar",dst);ﻫ

cvNamedWindow("inverselog-polar”,1);ﻫ

cvShowImage("inverselog—polar”,src2);ﻫ

cvWaitKey();

}ﻫ

return0;ﻫ}对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算)效果图:(什么东东长这么丑啊,汗)#include<cv。h〉ﻫ#include〈highgui。h>ﻫ#include<stdlib.h>

#include<stdio.h>IplImage*src=0;

IplImage*dst=0;IplConvKernel*element=0;

intelement_shape=CV_SHAPE_RECT;//theaddressofvariablewhichreceivestrackbarpositionupdateﻫintmax_iters=10;ﻫintopen_close_pos=0;ﻫinterode_dilate_pos=0;//callbackfunctionforopen/closetrackbar

voidOpenClose(intpos)

ﻫ{ﻫ

intn=open_close_pos-max_iters;ﻫ

intan=n〉0?n:-n;ﻫ

element=cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0);

if(n〈0)

{ﻫ

cvErode(src,dst,element,1);

cvDilate(dst,dst,element,1);

}ﻫ

else

{ﻫ

cvDilate(src,dst,element,1);

cvErode(dst,dst,element,1);ﻫ

}ﻫ

cvReleaseStructuringElement(&element);ﻫ

cvShowImage("Open/Close",dst);ﻫ}

//callbackfunctionforerode/dilatetrackbarﻫvoidErodeDilate(intpos)

ﻫ{ﻫ

intn=erode_dilate_pos-max_iters;

intan=n〉0?n:-n;ﻫ

element=cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0);

if(n<0)ﻫ

{ﻫ

cvErode(src,dst,element,1);

}

else

{ﻫ

cvDilate(src,dst,element,1);ﻫ

}ﻫ

cvReleaseStructuringElement(&element);

cvShowImage(”Erode/Dilate”,dst);ﻫ}

ﻫintmain(intargc,char**argv)ﻫ{ﻫ

char*filename=argc==2?argv[1]:(char*)”baboon.jpg”;ﻫ

if((src=cvLoadImage(filename,1))==0)ﻫ

return—1;

printf("Hotkeys:\n”

"\tESC—quittheprogram\n"

”\tr—userectanglestructuringelement\n"ﻫ

"\te-useellipticstructuringelement\n"ﻫ

”\tc-usecross—shapedstructuringelement\n"ﻫ

"\tENTER—loopthroughalltheoptions\n”);

dst=cvCloneImage(src);

//createwindowsforoutputimagesﻫ

cvNamedWindow("Open/Close”,1);

cvNamedWindow(”Erode/Dilate”,1);

open_close_pos=erode_dilate_pos=max_iters;ﻫ

cvCreateTrackbar(”iterations”,"Open/Close",&open_close_pos,max_iters*2+1,OpenClose);

cvCreateTrackbar(”iterations","Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);

for(;;)ﻫ

{ﻫ

intc;ﻫ

OpenClose(open_close_pos);ﻫ

ErodeDilate(erode_dilate_pos);ﻫ

c=cvWaitKey(0);

if((char)c==27)ﻫ

break;ﻫ

if((char)c=='e')ﻫ

element_shape=CV_SHAPE_ELLIPSE;ﻫ

elseif((char)c=='r’)

element_shape=CV_SHAPE_RECT;ﻫ

elseif((char)c=='c')ﻫ

element_shape=CV_SHAPE_CROSS;ﻫ

elseif((char)c=='\n')ﻫ

element_shape=(element_shape+1)%3;

//releaseimagesﻫ

cvReleaseImage(&src);ﻫ

cvReleaseImage(&dst);

//destroywindowsﻫ

cvDestroyWindow("Open/Close”);ﻫ

cvDestroyWindow("Erode/Dilate");

return0;

}用不同的核进行图像的二维滤波函数cvSmooth实现各种方法的图形平滑。一般来说,图像平滑主要是为了消

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论