您的位置:首页 > 运维架构

基于opencv技术获取视频流像素坐标

2014-06-03 20:55 701 查看
最近一直在学习opencv和研究图像以及摄像头处理,看到网上很多贴出的文章都是对于图片的处理以及图片中坐标获取,而对于摄像头模块没却没有获取坐标的办法,我自己研究了一段时间后结合别人给出的方法对于摄像头下视频流坐标获取方式给出了两种方式的代码:

第一种:需要鼠标点击才可以获取坐标的方式:

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
IplImage *frame = NULL;
/******************************处理函数部分*************************/
 void on_mouse(int event, int x, int y, int flags, void* ustc)
{
	CvFont font;
	cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);
	if (event == CV_EVENT_LBUTTONDOWN) 
	{
		CvPoint pt = cvPoint(x, y);
		char temp[16];
		sprintf(temp, "(%d,%d)", pt.x, pt.y);
		cvPutText(frame, temp, pt, &font, cvScalar(255, 255, 255, 0));
		cvCircle(frame, pt, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);
		cvShowImage("paper", frame);
	}
}
/*******************主函数部分***************************/
 int main()
{
	CvCapture* pCap = cvCreateCameraCapture(0);

	cvNamedWindow("getpoint", CV_WINDOW_AUTOSIZE);
	while ((frame = cvQueryFrame(pCap)) != 0 && cvWaitKey(20) != 27)
	{
		frame = cvQueryFrame(pCap);
		
		cvShowImage("getpoint", frame);
		cvSetMouseCallback("getpoint", on_mouse, 0);
	}
	cvReleaseCapture(&pCap);

	cvDestroyWindow("getpoint");
	return 0;
}
代码部分不是很长,但是要注意的是摄像头和图片处理方式的不同,而且鼠标点击的方式不会很耗内存,所以不是很卡,视频流畅,根据以上代码部分即可获取整个摄像头下的视频流下的坐标了;

第二种:鼠标移动即可获取坐标,可用来对于某些特殊像素点坐标的获取:

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h>  
IplImage *frame = NULL;
IplImage* point=0;  
/**************************定义鼠标移动函数*****************/
void on_mouse( int event, int x, int y, int flags, void* ustc)  
{  
    CvFont font;  
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);         
    if( event == CV_EVENT_MOUSEMOVE )  
    {  
        cvCopy(point,frame);  
        CvPoint pt = cvPoint(x,y);  
        char temp[16];  
        sprintf(temp,"(%d,%d)",pt.x,pt.y);  
        cvPutText(frame,temp, pt, &font, cvScalar(255, 255, 255, 0));  
        cvCircle( frame, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
        cvShowImage( "paper", frame );  
    }   
}  
  /*******************************主函数部分************************/
int main()  
{  
    CvCapture* pCap = cvCreateCameraCapture(0);
    point=cvCloneImage(frame);  
    cvNamedWindow("getpoint",1);  
    cvSetMouseCallback( "getpoint", on_mouse, 0 );  
    cvShowImage("getpoint",frame);  
    cvWaitKey(0);   
    cvDestroyAllWindows();  
    cvReleaseImage(&frame);  
    cvReleaseImage(&point);  
    return 0;  
}


这是在鼠标移动不需要点击就可以获取坐标的方式,但是由于没有处理好视频流问题,导致视频不够流畅主要是cvWaitKey()函数的处理需要注意下,我这个会导致内存不足而出现视频卡的情况,希望有人可以解决下!

代码不是很长,所以没有加注释,调用的基本上都是库函数,多多包涵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: