首页 OpenCV例程汇总

OpenCV例程汇总

举报
开通vip

OpenCV例程汇总OpenCV例程汇总 OpenCV例程汇总 TOC \o "1-3" \h \z \u 基于opencv的use摄像头视频采集程序 1 基于opencv的两个摄像头数据采集 3 能激发你用代码做视频的冲动程序 6 图像反转(就是把黑的变白,白的变黑) 11 图像格式的转换 12 从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测 13 采用Canny算子进行边缘检测 15 角点检测 18 图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) 21 Log-Polar极坐标变换 22 对图像进行形态学操作(图...

OpenCV例程汇总
OpenCV例程汇总 OpenCV例程汇总 TOC \o "1-3" \h \z \u 基于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 运动 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 检测(摄像头) 81 显示如何利用Camshift算法进行彩色目标的跟踪 86 基于opencv的use摄像头视频采集程序 准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。 建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码: #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include "highgui.h" void callback(IplImage* image); int main() { int ncams=cvcamGetCamerasCount( );//返回可以访问的摄像头数目 HWND MyWin;     // 设置系统属性 cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头   //camera     cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE); //We'll render stream     // 在本例中     // 假设创建一个窗口,并且窗口的ID是在变量 MyWin 中定义     // MyWin 是窗口 HWND 的类型     MyWin=(HWND)cvGetWindowHandle("CameraUSB window");       cvcamSetProperty(0,CVCAM_PROP_WINDOW,&MyWin);   // Selects a window for     //video rendering //回调 关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函 数将处理每一帧 cvcamSetProperty(0,CVCAM_PROP_CALLBACK,callback);      cvcamInit( );     cvcamStart( );     // 现在程序开始工作     cvWaitKey(0);     cvcamStop( );     cvcamExit( );     return 0; } // 在图像中画兰色水平线 void callback(IplImage* image) {     IplImage* image1 = image;     int i,j;         assert (image);         for(i=0; iheight; 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 #include #include #include "stdio.h" #include void StereoCallback(IplImage *frame1,IplImage *frame2); void onMouse1(int Event,int x,int y,int flags,void *param); void onMouse2(int Event,int x,int y,int flags,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"}; void main() {     HWND CaptureWindow1=0; //不赋值也行     HWND CaptureWindow2=0; //int ncams=cvcamGetCamerasCount(); //获取摄像头的个数,在这里可有可无 //用对话框的形式来选取摄像头     int *CameraNumber;     int nSelected = 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("cvcam1 Window",1);         CaptureWindow1=(HWND)cvGetWindowHandle("cvcam1 Window");         cvcamSetProperty(CameraNumber[0], CVCAM_PROP_ENABLE, CVCAMTRUE);         cvcamSetProperty(CameraNumber[0], CVCAM_PROP_RENDER, CVCAMTRUE);         cvcamSetProperty(CameraNumber[0], CVCAM_PROP_WINDOW, &CaptureWindow1); // cvSetMouseCallback("cvcam1 Window",onMouse1,0);         cvNamedWindow("cvcam2 Window",1);         CaptureWindow2=(HWND)cvGetWindowHandle("cvcam2 Window");         cvcamSetProperty(CameraNumber[1], CVCAM_PROP_ENABLE, CVCAMTRUE);         cvcamSetProperty(CameraNumber[1], CVCAM_PROP_RENDER, CVCAMTRUE);         cvcamSetProperty(CameraNumber[1], CVCAM_PROP_WINDOW, &CaptureWindow2); // cvSetMouseCallback("cvcam2 Window",onMouse2,0); //让两个摄像头同步    cvcamSetProperty(CameraNumber[0],CVCAM_STEREO_CALLBACK,(void*)&StereoCallback); //启动程序     cvcamInit();     cvcamStart(); cvSetMouseCallback("cvcam1 Window",onMouse1,0); cvSetMouseCallback("cvcam2 Window",onMouse2,0);     cvWaitKey(0);     cvcamStop(); free(CameraNumber); cvcamExit();     cvDestroyWindow("cvcam1 Window");     cvDestroyWindow("cvcam2 Window"); } void StereoCallback(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); } void onMouse1(int Event,int x,int y,int flags,void *param) { static int num=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++;    }    } void onMouse2(int Event,int x,int y,int flags,void *param) { static int num=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 #define NUMBER 100 #define DELAY 5 char wndname[] = "Drawing Demo"; CvScalar random_color(CvRNG* rng) //函数 cvRNG 初始化随机数生成器并返回其状态,RNG 随机数生成器 {     int icolor = cvRandInt(rng); //函数 cvRandInt 返回均匀分布的随机 32-bit 无符号整型值并更新 RNG 状态     return CV_RGB(icolor&255, (icolor>>8)&255, (icolor>>16)&255); //创建 一个色彩值 } int main( int argc, char** argv ) {     int line_type = CV_AA; // change it to 8 to see non-antialiased graphics     int i;     CvPoint pt1,pt2; //基于二维整形坐标轴的点     double angle;     CvSize sz;   //矩形框大小,以像素为精度     CvPoint ptt[6];     CvPoint* pt[2];     int arr[2];     CvFont font;     CvRNG rng;     int width = 1000, height = 700;     int width3 = width*3, height3 = height*3;     CvSize text_size;     int ymin = 0;     // Load the source image     IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );     IplImage* image2;     // Create a window     cvNamedWindow(wndname, 1 );     cvZero( image ); //#define cvZero cvSetZero   void cvSetZero( 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, "Northeast Petroleum University!", pt1, &font, random_color(&rng));//在图像中加入文本         cvShowImage(wndname,image);         cvWaitKey(DELAY);     }     cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 3, 3, 0.0, 5, line_type );     cvGetTextSize( "Opencv forever!", &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);     }     // Wait for a key stroke; the same function arranges events processing     cvWaitKey(0);     cvReleaseImage(&image);     cvReleaseImage(&image2);     cvDestroyWindow(wndname); return 0; } 效果图:太帅了 图像反转(就是把黑的变白,白的变黑) 黑的变白了,白的变黑了 源码: #include #include #include #include int main(int argc,char* argv[]) { IplImage* img=0; int height,width,step,channels; UCHAR* data; int i,j,k; if(argc<2) {    printf("Usage:InvImage\n\7");    exit(0); } img=cvLoadImage(argv[1]); if(!img) {    printf("Could not load image file:%s\n",argv[1]);    exit(0); } height=img->height; width=img->width; step=img->widthStep; channels=img->nChannels; data=(UCHAR*)img->imageData; printf("Processing a%d*%d image with %d channels\n",height,width,channels); cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin",100,100); for(i=0;i #include #include int main( int argc, char** argv ) { IplImage* src; // -1: the loaded image will be loaded as is (with number of channels depends on the file). if(argc != 3) {     printf("CONV: Image format convertion, support JPG,BMP,TIF,PNG,PPM\n");     printf("Usage: conv srcImage dstImage\n");     return 0; } 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: CONV only support JPG,BMP,TIF,PPM,TGA and PPM\n");     } else { if( (src=cvLoadImage(argv[1], -1))!= 0 ) {          cvSaveImage( argv[2], src);             cvReleaseImage(&src);             printf("\n Convert successfully.\n");     }     else     {        printf("\n*** Read or write image fails *** \n");     } } return 0; } 发现了个小问题: 原来的jpg图像只有102KB转换成bmp后变成549KB ,在运行程序把这个bmp转成jpg又只有81KB。这真是汗死我了 从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测 /* 程序名称:laplace.c 功能:从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。 */ #include "cv.h" #include "highgui.h" #include #include int main( int argc, 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 );     else if( argc == 2 )         capture = cvCaptureFromAVI( argv[1] );     if( !capture )     {         fprintf(stderr,"Could not initialize capturing...\n");         return -1;     }             cvNamedWindow( "Laplacian", 0 ); // 循环捕捉,直到用户按键跳出循环体     for(;;)     {         IplImage* frame = 0;         int i;         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");     return 0; } 采用Canny算子进行边缘检测 #include "cv.h" #include "highgui.h" char wndname[] = "Edge"; char tbarname[] = "Threshold"; int edge_thresh = 1; IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0; // 定义跟踪条的 callback 函数 void on_trackbar(int h) {     cvSmooth( gray, edge, CV_BLUR, 3, 3, 0 );     cvNot( gray, edge );     // 对灰度图像进行边缘检测     cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3);     cvZero( cedge );     // copy edge points     cvCopy( image, cedge, edge );     // 显示图像     cvShowImage(wndname, cedge); } int main( int argc, char** argv ) {     char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg";         if( (image = cvLoadImage( filename, 1)) == 0 )         return -1;     // Create the output image     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);     // Create a window     cvNamedWindow(wndname, 1);     // create a toolbar     cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar);     // Show the image     on_trackbar(1);     // Wait for a key stroke; the same function arranges events processing     cvWaitKey(0);     cvReleaseImage(&image);     cvReleaseImage(&gray);     cvReleaseImage(&edge);     cvDestroyWindow(wndname);     return 0; } /*******代码中的函数说明 1、cvSmooth,其函数声明为: cvSmooth( const void* srcarr, void* dstarr, int smoothtype,int param1, int param2, double param3 ) cvSmooth函数的作用是对图象做各种方法的图象平滑。其中,srcarr为输入图象;dstarr为输出图象; param1为平滑操作的第一个参数;param2为平滑操作的第二个参数(如果param2值为0,则表示它被设为param1); param3是对应高斯参数的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 差。 参数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、void cvNot(const CvArr* src,CvArr* dst); 函数cvNot()会将src中的每一个元素的每一位取反,然后把结果赋给dst。 因此,一个值为0x00的8位图像将被映射到0xff,而值为0x83的图像将被映射到0x7c。 3、void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size=3 ); 采用 Canny 算法做边缘检测 image 输入图像 edges 输出的边缘图像 threshold1 第一个阈值 threshold2 第二个阈值 aperture_size Sobel 算子内核大小 4、void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL ); 在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。 cvCopy会把src中的数据复制到dst的内存中。 5、cvCreateTrackbar 创建trackbar并将它添加到指定的窗口。 int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change ); trackbar_name 被创建的trackbar名字。 window_name 窗口名字,这个窗口将为被创建trackbar的父对象。 value 整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。 count 滑块位置的最大值。最小值一直是0。 on_change 每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。 函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量, 并且指定当trackbar位置被改变的时候调用的回调函数。被创建的trackbar显示在指定窗口的顶端。 */ 角点检测 原始图: 处理后图: 源代码: #include #include "cv.h" #include "highgui.h" #define max_corners 100 int main( int argc, char** argv ) {     int cornerCount=max_corners;     CvPoint2D32f corners[max_corners];     IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;     int i;     CvScalar color = CV_RGB(255,0,0);     char* filename = argc == 2 ? argv[1] : (char*)"pic3.png"; // 注意相对路径             cvNamedWindow( "image", 1 ); // create HighGUI window with name "image"         //Load the image to be processed     srcImage = cvLoadImage(filename, 1);         grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);         //copy the source image to copy image after converting the format     cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);         //create empty images of same size as the copied images     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, // block size         0, // not use harris         0.4 );         printf("num corners found: %d\n", cornerCount);         // draw circles at each corner location in the gray image and     //print out a list the corners     if(cornerCount>0)     {         for (i=0; i
本文档为【OpenCV例程汇总】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_773501
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:93
分类:工学
上传时间:2011-07-09
浏览量:20