移动背景减法(OpenCV)

时间:2014-03-02 20:41:20

标签: c++ opencv background-subtraction opticalflow

您是否知道移动相机背景扣除的任何来源? 我想写类似的东西: http://vimeo.com/72577177

有许多关于静止背景的运动检测的资料,但我找不到任何带有移动背景的代码示例。

编辑: 我通过检测最大数量的相似矢量来考虑光流和去除背景。可能就这么简单吗?

4 个答案:

答案 0 :(得分:2)

以下是关于此主题的两篇研究文章:

  • Mittal,A。et D. Huttenlocher。 2000年,«用于广域监视和现场的场景建模 图像合成»在IEEE会议上的计算机视觉和计算机视觉 模式识别(PDF

  • Hayman,E。et J. Eklundh。 2003年,«移动观测的统计背景减法 - ver»,在IEEE国际计算机视觉会议论文集中。 (PDF

答案 1 :(得分:2)

这不是背景减法!这是对象跟踪!

观看this视频。我想你正在寻找这样的东西。它在视频结尾处有一些纸质参考。搜索那些论文。

您可以在thisthis链接中找到该视频中的算法来源。

祝你好运!

答案 2 :(得分:1)

实现该视频并不是很难。因为移动物体很小而背景是静止的,尽管相机移动缓慢。

首先,确定连续帧之间的运动矢量。例如,帧t-1中的(100,100)处的像素在帧t中移动到(103,102)。由于背景的大多数部分是静态的,因此可以确定共同的运动矢量来描述大多数像素的运动。

其次,使用RANSAC或其他算法来找到不根据运动矢量移动的像素。这些像素代表移动物体。

答案 3 :(得分:0)

您引用的链接更像是对象跟踪。但是,如果您想使用opencv应用移动背景减法,则会更容易。它的工作原理类似于运动跟踪器。

这是代码:

public class sikapadapter extends RecyclerView.Adapter<sikapadapter.ViewHolder> {

    private int[] integer;
    String option[];
    private OnRadioChangeListener onRadioChangeListener;

    public sikapadapter(String[] option, OnRadioChangeListener onRadioChangeListener) {
        this.option = option;
        this.onRadioChangeListener = onRadioChangeListener;
        integer = new int[option.length];
    }

    interface OnRadioChangeListener{
        void onRadioChange(int position,int checkedId);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.recycleview_sikap_layout,parent,false);
        sikapadapter.ViewHolder aadvh = new sikapadapter.ViewHolder(view);
        return aadvh;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        if(integer[position] == 1){
            holder.radio.check(R.id.radiobutton1);
        }else if(integer[position] == 2){
            holder.radio.check(R.id.radiobutton2);
        }else if(integer[position] == 3){
            holder.radio.check(R.id.radiobutton3);
        }else if(integer[position] == 4){
            holder.radio.check(R.id.radiobutton4);
        }else {
            holder.radio.clearCheck();
        }

        holder.text.setText(option[position]);

        holder.radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if(onRadioChangeListener!=null){
                    if(checkedId == R.id.radiobutton1){
                        checkedId = 1;
                        integer[position] = 1;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton2){
                        checkedId = 2;
                        integer[position] = 2;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton3){
                        checkedId = 3;
                        integer[position] = 3;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton4){
                        checkedId = 4;
                        integer[position] = 4;
                        onRadioChangeListener.onRadioChange(position,checkedId);

                    }

                }
            }
        });


    }

    @Override
    public int getItemCount() {
        return option.length;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView text;
        RadioGroup radio;
        RadioButton radio1,radio2,radio3,radio4;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            text = itemView.findViewById(R.id.recytexttampil);
            radio = itemView.findViewById(R.id.radiogroup);
            radio1 = itemView.findViewById(R.id.radiobutton1);
            radio2 = itemView.findViewById(R.id.radiobutton2);
            radio3 = itemView.findViewById(R.id.radiobutton3);
            radio4 = itemView.findViewById(R.id.radiobutton4);


        }
    }
}

此代码使您可以在视频文件中应用背景减法并将其保存。