我想找到光流的平均值,我可以从第一帧中提取特征,并在下一帧中找到它们的位置。现在,我想找到位移的平均值,以便将图像转换回静止背景,以稳定图像。
// here I take the optical flow
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features,
frame2_features, corner_count, optical_flow_window, 5,
optical_flow_found_feature, NULL,
optical_flow_termination_criteria, NULL);
// here the features that I extract them
for( int i=0; i < corner_count; i++ ) {
CvPoint p,q;
if ( optical_flow_found_feature[i] == 0 ) continue;
p.x = (int) frame1_features[i].x;
p.y = (int) frame1_features[i].y;
q.x = (int) frame2_features[i].x;
q.y = (int) frame2_features[i].y;
double angle = atan2( (double) p.y - q.y, (double) p.x - q.x );
double hypotenuse = sqrt( square(p.y - q.y) + square(p.x - q.x) );
现在我想取他们的平均值,如果你想让我向你展示更多的代码,我已经准备好了。
corner_count是功能的数量。
答案 0 :(得分:1)
我假设你要写的是想要找到两帧之间所有特征点的平均位移。在这种情况下,您所要做的就是在特征循环中计算“斜边”,将其所有值相加,然后除以特征数。
好的,这是你的答案:
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features, frame2_features, corner_count, optical_flow_window, 5, optical_flow_found_feature, NULL, optical_flow_termination_criteria, NULL);
//here the features that I extract them
double sumOfDistances = 0;
for(int i = 0; i < corner_count; ++i)
{
int x1 = (int) frame1_features[i].x;
int y1 = (int) frame1_features[i].y;
int x2 = (int) frame2_features[i].x;
int y2 = (int) frame2_features[i].y;
int dx = x2 - x1;
int dy = y2 - y1;
sumOfDistances += sqrt(dx * dx + dy * dy);
}
double averageDistance = sumOfDistances / corner_count;
我在这里假设corner_count
是功能的数量。你需要确保它确实是正确的。另外,我还没有尝试编译它。如果我犯了任何错误,你可以自行修理它们。
但是,如果您计划的图像处理不仅仅是这一次,我建议您实际学习一些编程。我在这里做的是非常基本的东西。如果不了解这一点,你就不会走得太远。