我正在使用-Lucas-kanade算法来计算openCV视频序列的光流。我得到了运动矢量。现在我想将这些运动矢量分组在一些簇中。 彼此靠近的向量我想把它们组合在一起。有点像最近邻居的方法。但我不知道如何实现同样的目标。任何帮助将不胜感激。
谢谢。
我在运行光流算法后使用cvKMeans2()对角点进行分组......
我在向量clustercontainer的向量中有簇。现在我想在每个集群周围绘制一条边界线。我不知道怎么能这样做...如果有人知道请帮忙。
使用openCV手册中的以下代码我在每个群集周围绘制圆圈..但我想绘制矩形而不是圆形。任何身体都请帮助我。
for(int h = 0; h < clusterContainer.size(); h++ )
{
CvPoint pt1,pt2;
CvMat box[100];
pt1.x=(int)points->data.fl[h*2];
pt1.y=(int)points->data.fl[h*2+1];
cvCircle( frame1, pt1, 20, CV_RGB(255,255,0),4);
}
答案 0 :(得分:1)
要从一组点获取边界矩形,可以使用OpenCV boundingRect()函数。另请注意类似的fitEllipse()函数。
<强> boundingRect 强>
计算点集的右上边界矩形。
C++: Rect boundingRect(InputArray points)
Python: cv2.boundingRect(points) → retval
C: CvRect cvBoundingRect(CvArr* points, int update=0 )
Python: cv.BoundingRect(points, update=0) → CvRect
参数:points - 输入2D点集,存储在std :: vector或Mat中 该函数计算并返回指定点集的最小右上边界矩形。
<强> fitEllipse 强>
围绕一组2D点拟合椭圆。
C++: RotatedRect fitEllipse(InputArray points)
Python: cv2.fitEllipse(points) → retval
C: CvBox2D cvFitEllipse2(const CvArr* points)
Python: cv.FitEllipse2(points) → Box2D
参数:points - 输入2D点集,存储在:
std::vector<> or Mat (C++ interface)
CvSeq* or CvMat* (C interface)
Nx2 numpy array (Python interface)
该函数计算最适合(在最小二乘意义上)一组2D点的椭圆。它返回刻有椭圆的旋转矩形。使用算法[Fitzgibbon95]。
答案 1 :(得分:1)
我使用KMEAN算法对具有相似方向和幅度的运动矢量进行分组。
答案 2 :(得分:0)
在样本图像中,为什么要对具有相同方向且彼此接近的矢量进行分组? 请记住,在2D中,指向行进方向的矢量在图像中都具有不同的角度/方向。
我建议您将所有指向或多或少指向相同图像点的矢量组合在一起。