OPENCV常用小代码


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 ;
}






OpenCV小项目 这是一个个人在使用OpenCV过程中写的一些小项目,以及一些非常有用的OpenCV代码,有些代码是对某论文中的部分实现。 注意:代码是在Xcode里写的,如果要在win下测试,遇到问题自己修改。 opencv-rootsift-py 用python和OpenCV写的一个rootsift实现,其中RootSIFT部分的代码参照Implementing RootSIFT in Python and OpenCV这篇文章所写,通过这个你可以了解Three things everyone should know to improve object retrieval这篇文章中RootSIFT是怎么实现的。 sift(asift)-match-with-ransac-cpp 用C++和OpenCV写的一个图像匹配实现,里面包含了采用1NN匹配可视化、1NN匹配后经RANSAC剔除错配点可视化、1NN/2NN<0.8匹配可视化、1NN/2NN<0.8经 RANSAC剔除错配点可视化四个过程,其中1NN/2NN<0.8匹配过程是Lowe的Raw feature match,具体可以阅读Lowe的Distinctive image features from scale-invariant keypoints这篇文章。这个对图像检索重排非常有用。另外里面还有用OpenCV写的ASIFT,这部分来源于OPENCV ASIFT C++ IMPLEMENTATION,ASIFT还可以到官网页面下载,ASIFT提取的关键点 比SIFT要多得多,速度非常慢,不推荐在对要求实时性的应用中使用。 更多详细的分析可以阅读博文SIFT(ASIFT) Matching with RANSAC。 有用链接 OpenCV3.0文档 // 测试sparse unsigned int centersNum = 10; vector descrNums; descrNums.push_back(8); descrNums.push_back(12); //unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5; 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5, 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; sp_mat Hist(descrNums.size(), centersNum); static long int count = 0; for (int i = 0; i < descrNums.size(); i++){ unsigned int* desrcElementsTmp = new unsigned int[descrNums[i]]; memcpy(desrcElementsTmp, T + count, descrNums[i] * sizeof(T[0])); //cout << desrcElementsTmp[0] << '\t' << desrcElementsTmp[1] << '\t' << desrcElementsTmp[2] << '\t' << desrcElementsTmp[3] << '\t' << desrcElementsTmp[4] << '\t' <<endl; //cout << desrcElementsTmp[5] << '\t' << desrcElementsTmp[6] << '\t' << desrcElementsTmp[7] << '\t' << desrcElementsTmp[8] << '\t' << desrcElementsTmp[9] << '\t' << desrcElementsTmp[10] << '\t' <<endl; //cout << endl; sp_mat X(1, centersNum); X.zeros(); for (int j = 0; j < descrNums[i]; j++){ X(0, desrcElementsTmp[j]-1) += 1; } X.print("X:"); X = X/norm(X, 2); Hist.row(i) = X; count = count + descrNums[i]; delete desrcElementsTmp; } //Hist.print("Hist:");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值