背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能...


背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料。本文将更加详细的介绍背景减法库(BGS Library)的基本框架与入口函数main()的功能。


BGS库的整体框架在背景建模技术(二)中已经全部给出,此处从函数的角度再次给出BGS库的基本框架,有利于代码的修改与维护。


如下图所示是基于C++的BGS库的函数流程图:




接下来将会对每个函数进行更加详细的分析。


首先,先看入口函数main(),代码如下:


#include "Config.h"
#include "VideoAnalysis.h"
#include <iostream>

using namespace std;

namespace bgslibrary
{
	class Main
	{
		private:
		Main();

		public:
		static void start(int argc, const char **argv)
		{
			cout << "-----------------------------------------" << endl;
			cout << "Background Subtraction Library v1.9.2     " << endl;
			cout << "http://code.google.com/p/bgslibrary       " << endl;
			cout << "by:                                       " << endl;
			cout << "Andrews Sobral (andrewssobral@gmail.com)  " << endl;
			cout << "Optimized by:                             " << endl;
			cout << "Rui-Dong Fang(National Huaqiao University)" << endl;
			cout << "-----------------------------------------" << endl;
			cout << "Using OpenCV version " << CV_VERSION << endl;

			try
			{
				int key = KEY_ESC;

				do
				{
					VideoAnalysis* videoAnalysis = new VideoAnalysis;

					if (videoAnalysis->setup(argc, argv))	///videoAnalysis->setup(argc, argv)
					{
						videoAnalysis->start();

						cout << "Processing finished, enter:" << endl;
						cout << "R - Repeat" << endl;
						cout << "Q - Quit" << endl;

						key = cv::waitKey();
					}

					cv::destroyAllWindows();
					delete videoAnalysis;

				} 
				while (key == KEY_REPEAT);
			}
			catch (const std::exception& ex)
			{
				cout << "std::exception:" << ex.what() << endl;
				return;
			}
			catch (...)
			{
				cout << "Unknow error" << endl;
				return;
			}

#ifdef WIN32
	//system("pause");
#endif
		}
	};
}

int main(int argc, const char **argv)
{
	bgslibrary::Main::start(argc, argv);
	return 0;
}



在main()函数中,除了打印出相关信息和设置waitKey()以外,主要就是调用了VIdeoAnalysis.cpp(将在下一篇博文中分析)中的videoAnalysis->setup(argc, argv)和videoAnalysis->start()。下面给出Main.cpp的代码流程图:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码存在一些问题,比如: 1. 在 Base 类中,没有实现对速度的限制,可能导致物体移动过快或过慢。 2. 在 Background 类中,没有考虑到循环播放背景图片的情况,会导致背景图片移动到屏幕底部后出现空白区域。 3. 在 main 函数中,调用了一个名为 a 的变量的 show 方法,但是 a 并不是一个对象,会导致 AttributeError 错误。 下面是修改后的代码: ```python import random import time import pygame from pygame.constants import * from pygame.image import load as addimage class Base(object): def __init__(self, image, x, y, screen): self.x = x self.y = y self.image = image self.screen = screen self.speedx = 0 self.speedy = 0 self.max_speed = 10 # 设置最大速度 def draw(self): self.screen.blit(self.image, (self.x, self.y)) def changespeed(self, x, y): if abs(self.speedx + x) < self.max_speed: # 控制速度不超过最大速度 self.speedx += x if abs(self.speedy + y) < self.max_speed: self.speedy += y def changespeedx(self, x): if abs(self.speedx + x) < self.max_speed: self.speedx += x def changespeedy(self, y): if abs(self.speedy + y) < self.max_speed: self.speedy += y def move(self): self.x += self.speedx self.y += self.speedy class Background(): def __init__(self): pygame.display.set_caption("Plane War Game") self.image1 = Base(addimage('./images/bg1.png'), 0, -1200) self.image2 = Base(addimage('./images/bg2.png'), 0, -600) self.image3 = Base(addimage('./images/bg3.png'), 0, 0) self.bgs = [] self.bgs.append(self.image1) self.bgs.append(self.image2) self.bgs.append(self.image3) self.speedy = 3 for bg in self.bgs: bg.changespeedy(self.speedy) def show(self): for bg in self.bgs: bg.move() bg.draw() if bg.y > 1800: # 判断是否到达屏幕底部 bg.y = self.bgs[self.bgs.index(bg)-1].y - 600 # 计算下一张图片的位置 def main(): maxsize = (800, 600) screen = pygame.display.set_mode(maxsize) bg = Background() # 实例化 Background 类 while True: bg.show() # 调用 Background 类的 show 方法 pygame.display.update() time.sleep(0.03) if __name__ == '__main__': main() ``` 修改后的代码增加了对速度的限制,使得物体移动更加平稳;在 Background 类中新增了循环播放背景图片的功能,避免了出现空白区域的问题;在 main 函数中,创建了 Background 类的实例,并调用其 show 方法来播放背景图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值