如何显示光流图 opencv

主调函数:
Mat color;
MotionToColor(flow,color);//flow 中为Mat类型的UV值
imshow("1",color);
waitKey(0);



结果如图所示
#define UNKNOWN_FLOW_THRESH 1e9
void MakeColorWheel(vector &colorwheel)  
{  
	int RY = 15;  
	int YG = 6;  
	int GC = 4;  
	int CB = 11;  
	int BM = 13;  
	int MR = 6;  
	int i;  
	for (i = 0; i < RY; i++) colorwheel.push_back(Scalar(255,       255*i/RY,     0));  
	for (i = 0; i < YG; i++) colorwheel.push_back(Scalar(255-255*i/YG, 255,       0));  
	for (i = 0; i < GC; i++) colorwheel.push_back(Scalar(0,         255,      255*i/GC));  
	for (i = 0; i < CB; i++) colorwheel.push_back(Scalar(0,   255-255*i/CB, 255));  
	for (i = 0; i < BM; i++) colorwheel.push_back(Scalar(255*i/BM,      0,        255));  
	for (i = 0; i < MR; i++) colorwheel.push_back(Scalar(255,    0,   255-255*i/MR));  
}  

void MotionToColor(Mat flow, Mat &color)  
{  
	if (color.empty())  
	color.create(flow.rows, flow.cols, CV_8UC3);  
	static vector colorwheel; //Scalar r,g,b   
	if (colorwheel.empty())  
	MakeColorWheel(colorwheel);  

	// determine motion range:   
	float maxrad = -1;  

	// Find max flow to normalize fx and fy   
	for (int i= 0; i < flow.rows; ++i)   
	{  
		for (int j = 0; j < flow.cols; ++j)   
		{  
			Vec2f flow_at_point = flow.at(i, j);  
			float fx = flow_at_point[0];  
			float fy = flow_at_point[1];  
			if ((fabs(fx) >  UNKNOWN_FLOW_THRESH) || (fabs(fy) >  UNKNOWN_FLOW_THRESH))  
			continue;  
			float rad = sqrt(fx * fx + fy * fy);  
			maxrad = maxrad > rad ? maxrad : rad;  
		}  
	}  

for (int i= 0; i < flow.rows; ++i)   
{  
	for (int j = 0; j < flow.cols; ++j)   
	{  
		uchar *data = color.data + color.step[0] * i + color.step[1] * j;  
		Vec2f flow_at_point = flow.at(i, j);  
		float fx = flow_at_point[0] / maxrad;  
		float fy = flow_at_point[1] / maxrad;  
		if ((fabs(fx) >  UNKNOWN_FLOW_THRESH) || (fabs(fy) >  UNKNOWN_FLOW_THRESH))  
		{  
			data[0] = data[1] = data[2] = 0;  
			continue;  
		}  
		float rad = sqrt(fx * fx + fy * fy);  
		float angle = atan2(-fy, -fx) / CV_PI;  
		float fk = (angle + 1.0) / 2.0 * (colorwheel.size()-1);  
		int k0 = (int)fk;  
		int k1 = (k0 + 1) % colorwheel.size();  
		float f = fk - k0;  
		//f = 0; // uncomment to see original color wheel   
		for (int b = 0; b < 3; b++)   
			{  
				float col0 = colorwheel[k0][b] / 255.0;  
				float col1 = colorwheel[k1][b] / 255.0;  
				float col = (1 - f) * col0 + f * col1;  
				if (rad <= 1)  
					col = 1 - rad * (1 - col); // increase saturation with radius   
				else  
					col *= .75; // out of range   
				data[2 - b] = (int)(255.0 * col);  
			}  
	}  
	}  
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值