代码之家  ›  专栏  ›  技术社区  ›  Doofenmirtz Mirtz

录制视频中特定对象的角度检测

  •  0
  • Doofenmirtz Mirtz  · 技术社区  · 2 年前

    我正在努力找出 黑色条纹的角度 在下面的照片中为整个录制的视频。我试图在网上找到代码,但只能找到图像的代码,或者需要手动输入在图像上画线和查找角度。你知道任何类似于这个问题的项目或开源代码吗?

    enter image description here

    试图找到开源代码,找到了github关于图像中物体姿态估计和角度检测的项目。找不到任何录制的视频和对象跟踪信息

    1 回复  |  直到 1 年前
        1
  •  1
  •   ZebraEagle    2 年前

    我认为第一步就是先把你的视频分解成一系列的图像,然后你可以单独处理它们(例如,按照这个 method ).你很可能不需要处理所有这些,因为我想你对骑手的倾斜角度感兴趣,而且我怀疑你是否能够用这种设置来测量以1/帧速率为量级的时间尺度的角度变化。

    假设你只对视频帧的水平或垂直角度感兴趣(我没有看到任何其他基准点),那么你可以使用Canny边缘检测:

    import cv2
    
    img = cv2.imread("image.png", flags=0)
    img_blur = cv2.GaussianBlur(img, (3, 3), 0, 0)
    
    edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200)
    
    cv2.imshow("Edges", edges)
    cv2.waitKey(0)
    

    这可以让你检测到背心上条纹的边缘。您可以使用感兴趣的区域只考虑框架的某个部分,然后查找角或边,并找到这些边相对于水平面的角度。

    我不确定是否有现成的方法可以做到这一点,因为我认为使用其他对象跟踪方法,你只需要找到该区域的质心,而不需要额外的步骤。

        2
  •  0
  •   John Bofarull Guix    1 年前

    1.-输入图像

    A=imread('001.jpg');
    hf=figure(1);
    ax=gca
    imshow(A);
    

    2.-调整对比度

    th_low=.3  % low contrast threshold
    th_high=.7  % high contrast threshold
    
    A2=imadjust(A,[th_low th_low th_low; th_high th_high th_high],[]);
    

    如果不调整对比度,就会有一些“铃声”。 沿示例横截面显示我所说的“振铃”

    enter image description here

    hold(ax,'on');
    plot(ax,[130:190],200,'b*')
    
     figure(2);
     stem([130:190],A(200,[130:190],1),'Color','r');
     grid on
     hold on
     title('without contrast adjustment')
     stem([130:190],A(200,[130:190],2),'Color','g');
     stem([130:190],A(200,[130:190],3),'Color','b');
    

    enter image description here

     figure(3);
     stem([130:190],A2(200,[130:190],1),'Color','r');
     grid on
     hold on
     title('with contrast adjustment')
     stem([130:190],A2(200,[130:190],2),'Color','g');
     stem([130:190],A2(200,[130:190],3),'Color','b');
    

    enter image description here

    感兴趣的截面的方差要低得多 沿着内侧是感兴趣的,在提高对比度后,末端更清晰

    3.-在感兴趣的区域内获取单点参考

    我知道你会喜欢没有任何互动的,谁会不同意呢。

    然而,单点只是跳过识别感兴趣的区域,即目标地带。

    这样的分类并不困难,但很费力,我希望你同意这样一个事实,即这样的分类至少需要另一个问题,例如:“在这些分割的区域中找到头盔、道路限制、人行道。”。。直到进入兴趣地带。

    figure(4)
    ax4=gca
    imshow(A2)
    hold(ax4,'on');
    

    enter image description here

    print('click on 1 point inside area of interest');
    [y0,x0]=ginput(1);
    
    x0=floor(x0);y0=floor(y0);
    
    plot(ax4,y0,x0,'g*');
    
    Ar=A2(:,:,1);  % red
    Ag=A2(:,:,2);  % green 
    Ab=A2(:,:,3);  % blue
    
    ar0=double(Ar(x0,y0))
    ag0=double(Ag(x0,y0))
    ab0=double(Ab(x0,y0))
    
    er_r=.05;er_g=.05;er_b=.05;  % error threshold 1%
    
    d1=5;  % NOT euclidean, ABS distance
    
    nxr=1;nxl=1;nyu=1;nyd=1;
    
    A0=[Ar(x0,y0) Ag(x0,y0) Ab(x0,y0)]
    
    A_right=[Ar(x0+nxr,y0) Ag(x0+nxr,y0) Ab(x0+nxr,y0)]
    A_left=[Ar(x0-nxl,y0) Ag(x0-nxl,y0) Ab(x0-nxl,y0)]
    A_up=double([Ar(x0,y0+nyu) Ag(x0,y0+nyu) Ab(x0,y0+nyu)])
    A_down=double([Ar(x0,y0-nyd) Ag(x0,y0-nyd) Ab(x0,y0-nyd)])
    
    while abs(double(A0(1))-double(A_right(1)))<d1 && ...       % right
            abs(double(A0(2))-double(A_right(2)))<d1 && ...
            abs(double(A0(3))-double(A_right(3)))<d1 && ...
            y0+nxr<size(Ar,2)
    
            plot(ax4,y0+nxr,x0,'b*')
            nxr=nxr+1;
            A_right=[Ar(x0,y0+nxr) Ag(x0,y0+nxr) Ab(x0,y0+nxr)]
            plot(ax4,y0+nxr,x0,'r*')
    end
    
    while abs(double(A0(1))-double(A_left(1)))<d1 && ...      % left
            abs(double(A0(2))-double(A_left(2)))<d1 && ...
            abs(double(A0(3))-double(A_left(3)))<d1 && ...
            y0-nxl>1
    
            plot(ax4,y0-nxl,x0,'b*')
            nxl=nxl+1;
            A_left=[Ar(x0,y0-nxl) Ag(x0,y0-nxl) Ab(x0,y0-nxl)]
            plot(ax4,y0-nxl,x0,'r*')
    end
    
    while abs(double(A0(1))-double(A_down(1)))<d1 && ...      % down
            abs(double(A0(2))-double(A_down(2)))<d1 && ...
            abs(double(A0(3))-double(A_down(3)))<d1 && ...
            x0+nyd<size(Ar,1)
    
            plot(ax4,y0,x0+nyd,'b*')
            nyd=nyd+1;
            A_down=[Ar(x0+nyd,y0) Ag(x0+nyd,y0) Ab(x0+nyd,y0)]
            plot(ax4,y0,x0+nyd,'r*')
    end
    
    while abs(double(A0(1))-double(A_up(1)))<d1 && ...      % up
            abs(double(A0(2))-double(A_up(2)))<d1 && ...
            abs(double(A0(3))-double(A_up(3)))<d1 && ...
            x0-nyu>1
    
            plot(ax4,y0,x0-nyu,'b*') % check
            nyu=nyu+1;
            A_up=[Ar(x0-nyu,y0) Ag(x0-nyu,y0) Ab(x0-nyu,y0)]
            plot(ax4,y0,x0-nyu,'r*') % check
    end
    

    生成的十字架

    enter image description here

    while循环中的绘图线只是为了确保“交叉” 最终到达它应该到达的地方。

    你所说的“方向”现在可以找到进一步的处理 “十字架”的上侧。这应该很容易找到 上侧向左或向右“转弯”,因此为的“视觉方向” 驾驶员,这很可能是你只需要从标有条纹的驾驶员背部的姿态中获得的。

    黑色&白色更容易,但现在你有了可能 直接寻找具有个性的hi-vi背心荧光绿 用鼠标点击一下就可以解决我切下的角。

    我想进一步阐述和添加更多的脚本,精确地开发 这些结束语,但也许最好得到一些反馈 第一

    对于以下步骤,如果您需要进一步的帮助,只需发布另一个问题,并让我知道下一个问题的链接。