用Opencv实时画运动轨迹的思路

编程时发现用cvcircle只能画出目标的当前位置,通过百度发现一种思路,目前正在实验中。。

 
  
你获取了手心位置当前的坐标以后用来做起点,再持续跟踪,把下一个手心坐标做终点画线,就这么一直画不就是运动轨迹了么
就是保存当前捕捉到的坐标a,然后下次捕捉到坐标b的时候用这对坐标画线,更新a坐标为b的值,再捕捉到下一坐标b画线,重复就行了
画线是用line函数啊,你ciecle当然是一个点了。另外不用数组存坐标,用一个变量就行了,变量的作用域要确保在跟踪函数之外,可以用全局变量存。

根据上述思路进行了大胆的尝试!然后发现还是不行,只要当前图像一更新,之前画的轨迹就全都没了。

所以采取了下列思路:

开一个黑屏,画红色轨迹,等原背景图像全部更新完了,直接对着像素值全部贴在背景图像上。。笨办法

但是最终也实现了“实时”的显示轨迹。。。

关键代码如下:   

			//创建全黑图像
			lineimage = cvCreateImage(cvSize(frame.cols, frame.rows),  IPL_DEPTH_8U, 3);		
			int width=lineimage->width;
			int height=lineimage->height;
			for(i;iimageData+i*lineimage->widthStep);
			         for(int j=0;j

虽然到后面发现开不开黑屏完全无所谓,只要知道自己的轨迹是用什么鲜艳的颜色标出来的就行了,和默认生成图像颜色像素值RGB任何一个只要不同就行了。

在这里友情提醒:在RGB图像存储时默认每个像素的存储顺序是BGR!!!!

// 计算重心

         double posX = moment10 / area;
         double posY = moment01 / area;		 

		 centerpoint.x = posX;
		 centerpoint.y = posY;
		 cvCircle( sourceimage, centerpoint , 3 , CV_RGB(255,0,0), 1, 8, 0 );

		 if(( centerpoint.x > 0) && ( centerpoint.y > 0))
		 {
			 if (j == 1)
			 {
				 startpoint = centerpoint;
				 endpoint = startpoint;
				 j = 2;
			 }
			 if((j > 1) && ( centerpoint.x > 0) && ( centerpoint.y > 0))
			 {
				 endpoint = centerpoint;
				 cvLine( lineimage, startpoint, endpoint, CV_RGB( 255, 0, 0), 1);
				 startpoint = endpoint;
			 }
		 }

//将轨迹贴到背景图像上
		    int width = lineimage->width;
			int height = lineimage->height;
			for(int k = 0; k < height; k++)
			{
					uchar* pData = (uchar*)(lineimage->imageData + k*lineimage->widthStep);
			        uchar* pbData = (uchar*)(backimage->imageData + k*backimage->widthStep);
			         for(int j = 0; j < width; j++)
					 {
						 if( pData[3*j+2] == 255)
						     {
								 pbData[3*j] = 0;
								 pbData[3*j+1] = 0;
								 pbData[3*j+2] = 0;
							}
					 }
			}


你可能感兴趣的:(学习)