Matlab 从流线中提取特征点并对其进行聚类?

Matlab 从流线中提取特征点并对其进行聚类?,matlab,tracking,matlab-cvst,opticalflow,vision,Matlab,Tracking,Matlab Cvst,Opticalflow,Vision,我正在尝试使用matlab制作一个可靠的乘客计数系统,摄像头将固定在门上方。我可以用Lucas Kanade光流得到流线,这些线代表人的运动。我想: 如果直线足够长,则仅从这些直线中提取端点(直线矩阵包含所有点,甚至是地板上某个随机部分上不会发生变化的点) 将这些“优点”进行聚类,得到代表人的聚类者的质心 在这些簇中心上创建固定大小的边界框,并将其发送到多对象KLT跟踪程序 有谁能告诉我一个从直线矩阵中提取点的好方法吗?我的matlab语法太糟糕了,我已经没有时间完成了,这是一个uni项目。提前

我正在尝试使用matlab制作一个可靠的乘客计数系统,摄像头将固定在门上方。我可以用Lucas Kanade光流得到流线,这些线代表人的运动。我想:

  • 如果直线足够长,则仅从这些直线中提取端点(直线矩阵包含所有点,甚至是地板上某个随机部分上不会发生变化的点)
  • 将这些“优点”进行聚类,得到代表人的聚类者的质心
  • 在这些簇中心上创建固定大小的边界框,并将其发送到多对象KLT跟踪程序
  • 有谁能告诉我一个从直线矩阵中提取点的好方法吗?我的matlab语法太糟糕了,我已经没有时间完成了,这是一个uni项目。提前谢谢

    %example
        videoReader = vision.VideoFileReader('5Converted.avi','ImageColorSpace','Intensity','VideoOutputDataType','uint8');
        converter = vision.ImageDataTypeConverter; 
        opticalFlow = vision.OpticalFlow('ReferenceFrameDelay', 1);
        opticalFlow.OutputValue = 'Horizontal and vertical components in complex form';
        shapeInserter = vision.ShapeInserter('Shape','Lines','BorderColor','Custom', 'CustomBorderColor', 255);
        videoPlayer = vision.VideoPlayer('Name','Motion Vector');
        while ~isDone(videoReader)
            frame = step(videoReader);
            im = step(converter, frame);
            of = step(opticalFlow, im);
            [lines, trackedPoints] = getFlowLines(of, 20);
            if ~isempty(lines)   
              out =  step(shapeInserter, im, lines);   
            end
        end
        release(videoPlayer);
        release(videoReader);
    
    这是GetFLowLines函数(示例的稍微修改版本):


    这不是我的专长,所以无论如何我都不会回答你的问题。。。但是,如果你想增加有人尝试的机会,你最好包括一个完整的可运行示例(例如,提供一个指向电影数据的链接)。我建议你阅读如何创建一个红外传感器,然后相应地修改你的问题。如果你想计算穿过门的人数,为什么你不使用红外传感器或比照相机更可靠的东西?使用红外传感器对多人来说也是一个问题,我不知道只是我没有更多的时间,我一直在使用过去6个月的计算机视觉,所以现在不想完全重新设计我的方法。
    > function [vel_Lines, allTrackedPoints] = getFlowLines(vel_Values,
    > scaleFactor)  %Modified function based on Matlab's
    > 'videooptflowlines.m' helper function 
    > 
    > persistent first_time; persistent X; persistent Y; persistent RV;
    > persistent CV; if isempty(first_time)
    >     first_time     = 1;
    >     %% user may change the following three parameters
    >     borderOffset   = 5;
    >     decimFactorRow = 5;
    >     decimFactorCol = 5;    
    >     %%
    >     [R C] = size(vel_Values);
    >     RV = borderOffset:decimFactorRow:(R-borderOffset);   
    >     CV = borderOffset:decimFactorCol:(C-borderOffset);
    >     [Y X] = meshgrid(CV,RV); end
    > 
    > tmp = vel_Values(RV,CV); tmp = tmp.*scaleFactor; vel_Lines = [Y(:)  
    > X(:)   Y(:)+real(tmp(:))   X(:)+imag(tmp(:))]; allTrackedPoints =
    > [Y(:)+real(tmp(:))   X(:)+imag(tmp(:))];