OpenCV例程.docx
- 文档编号:27210975
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:122
- 大小:1.60MB
OpenCV例程.docx
《OpenCV例程.docx》由会员分享,可在线阅读,更多相关《OpenCV例程.docx(122页珍藏版)》请在冰豆网上搜索。
OpenCV例程
OpenCV例程汇总
基于opencv的use摄像头视频采集程序1
基于opencv的两个摄像头数据采集3
能激发你用代码做视频的冲动程序6
图像反转(就是把黑的变白,白的变黑)11
图像格式的转换12
从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测13
采用Canny算子进行边缘检测15
角点检测18
图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的)21
Log-Polar极坐标变换22
对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算)24
用不同的核进行图像的二维滤波27
图像域的填充30
寻找轮廓实现视频流的运动目标检测(超推荐一下)35
采用金字塔方法进行图像分割40
图像的亮度变换43
单通道图像的直方图46
计算和显示彩色图像的二维色调-饱和度图像48
图像的直方图均匀化50
用Hongh变换检测线段52
利用Hough变换检测圆(是圆不是椭圆)57
距离变换59
椭圆曲线拟合64
由点集序列或数组创建凸外形68
Delaunay三角形和Voronoi划分的迭代式构造71
利用背景建模检测运动物体(推荐)78
运动模板检测(摄像头)81
显示如何利用Camshift算法进行彩色目标的跟踪86
基于opencv的use摄像头视频采集程序
准备工作:
你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可XX一下。
建立一个基于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
{
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
#include
#include
#include"stdio.h"
#include
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
#include
#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 { 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 { 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 { 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 { 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 { 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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenCV 例程