OPENCV常用小代码
来源:互联网 发布:p2p网络投资理财 编辑:程序博客网 时间:2024/04/30 21:15
opencv抓取帧:
OpenCV支持从摄像头或视频文件(AVI)中抓取图像并保存为另一视频文件. 一、 从摄像头获取初始化: CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0 从视频文件filename.avi获取初始化: CvCapture* capture = cvCaptureFromAVI("infile.avi"); 抓取帧: IplImage* img = 0; if(!cvGrabFrame(capture)){ // 抓取一帧,失败退出 printf("Could not grab a frame\n"); exit(0); } img=cvRetrieveFrame(capture); // 恢复获取的帧图像 要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像. 释放抓取源(和释放单幅图像时类似): cvReleaseCapture(&capture); 注意由设备抓取的图像是由capture函数自动分配和释放的. 不要试图自己释放它. 获取设备特性: cvQueryFrame(capture); // this call is necessary to get correct // capture properties int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); 所有帧数似乎只与视频文件有关. 用摄像头时不对,奇怪!!!. 获取帧信息: float posMsec = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC); int posFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES); float posRatio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO); 获取所抓取帧在视频序列中的位置, 从首帧开始按[毫秒]算. 或者从首帧开始从0标号, 获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1, 只对视频文件有效. 设定所抓取的第一帧标号: // 从视频文件相对位置0.9处开始抓取 cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO, (double)0.9); 只对从视频文件抓取有效. 不过似乎也不成功!!!
图像差分
void imgDifferUtil::Image_Minus(IplImage *X, IplImage *Y, IplImage *X_Y){ //图像差分函数,将图像1中像素和图像2中对应像素想减,要求X、Y、X_Y大小相同 int i,j,width,height,step,chanel; unsigned char *dataX, *dataY, *dataX_Y; width = X->width; height = X->height; dataX = (unsigned char *)X->imageData; dataY = (unsigned char *)Y->imageData; dataX_Y = (unsigned char *)X_Y->imageData; step = X->widthStep/sizeof(char); chanel = X->nChannels; for(i=0; i<height; i++) for(j=0; j<width*chanel; j++) dataX_Y[i*step+j] = abs( dataX[i*step+j] - dataY[i*step+j]);}
opencv变为灰度图及新定义大小
IplImage* toGray(IplImage* img){IplImage* dst = cvCreateImage(cvGetSize(img),img->depth,1);IplImage* tmp =dst ;if(NULL == dst)return NULL;cvCvtColor(img, dst, CV_BGR2GRAY);//cvReleaseImage(&dst);return dst;}IplImage* toNewSize(IplImage* pFrame){ IplImage* dst = cvCreateImage(cv::Size(EVALUATE_IMG_WIDTH,EVALUATE_IMG_HEIGHT),pFrame->depth,pFrame->nChannels); //构造目标图象 if(dst==NULL) return NULL ; cvResize(pFrame,dst,CV_INTER_NN); return dst ;}
显示灰度
void printGrayScale(IplImage *src){int width=src->width;//图片宽度int height = src->height;//图片高度for (size_t row=0;row<height;row++){uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针for (size_t cols=0;cols<width;cols++){int intensity=ptr[cols];printf("%03d ",intensity);}printf("\n");}}
图像灰度,均值,指纹,方差
unsigned int getAverageWithPrintGrayScale(IplImage *src,bool printflag){unsigned int average=0 ;int width=src->width;//图片宽度int height = src->height;//图片高度// 打印图像灰度for (size_t row=0;row<height;row++){uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针for (size_t cols=0;cols<width;cols++){int intensity=ptr[cols];if(printflag)printf("%03d ",intensity);average +=intensity ;}if(printflag)printf("\n");}average /= width*height;if(printflag)printf("average:%d \n",average);return average ;}void getFingerPrint(IplImage *src,unsigned int average ,bool printflag){int width=src->width;//图片宽度int height = src->height;//图片高度// 打印图像指纹for (size_t row=0;row<height;row++){uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针for (size_t cols=0;cols<width;cols++){int intensity= ( ptr[cols] > average) ? 1 : 0 ;printf("%d ",intensity);}printf("\n");}}float getVariance(IplImage *src,unsigned int average,bool printflag){int width=src->width;//图片宽度int height = src->height;//图片高度//求图像方差float variance=0 ;int val =0 ; int tmp =0 ;for (size_t row=0;row<height;row++){uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针for (size_t cols=0;cols<width;cols++){val = ptr[cols] ;tmp = ( val- average)*( val- average) ;//printf("%03d %d",ptr[cols],tmp);variance = variance + (float)tmp ;//printf(" v:%f **",variance);}//printf("\n");}//printf("varianceALL:%f \n",variance);variance/=width*height ;//printf("varianceOne:%f \n",variance);variance = sqrtf(variance);if(printflag)printf("variance:%f \n",variance);return variance ;}
0 0
- OPENCV常用小代码
- opencv 常用代码段
- opencv常用代码
- opencv常用的小工程
- opencv小波变换代码
- opencv小波变换代码
- 常用小代码
- 常用js小代码
- 常用小代码
- 常用小代码
- Android 常用小代码
- js常用小代码
- OpenCV常用操作的代码
- OpenCV中常用代码段
- opencv需常用的小工程
- opencv常用的基础小工程
- OPENCV中常用的小程序
- OpenCV常用的基础小工程
- jQuery $.each用法
- 18. 4Sum
- EventBus代替Intent将复杂对象传递给下一个即将启动的Activity
- java io基础
- 机房重构——泛型 or DataTable?
- OPENCV常用小代码
- 映射表操作中的常用数组
- 自定义Cell的Button无法点击
- 极客DIY:用树莓派制作低成本高清监控摄像机
- 帝国cms循环列出所有子栏目名,和当前子栏目下的文章列表和所有栏目信息数
- SQLServer2008 突然用不了搜索文本了,就是Ctrl+F这个功能
- 【常用工具类】SharedPreferences封装类SPUtils
- Android系统架构
- 欢迎使用CSDN-markdown编辑器