OpenCV做飞机射击类游戏(一)

1.OpenCV的配置:

要求:

Win7  Win8  Win10系统。

opencv的安装路径为默认。

电脑为 64 位。

1.安装Opencv1.0和VC6.0++ :

VC6.0++的安装路径可以改变,但是Opencv的安装路径最默认,不要改变其安装路径,不然会很麻烦。

2.添加环境变量:

右键我的电脑->属性->高级系统设置->环境变量->用户变量的Path添加 C:\Program Files (x86)\OpenCV\bin;

3.进入VC6.0++ 进行配置:

工具->选项->目录

选择Include files

添加以下:

C:\PROGRAM FILES (X86)\OPENCV\CXCORE\INCLUDE

C:\PROGRAM FILES (X86)\OPENCV\CVAUX\INCLUDE

C:\PROGRAM FILES (X86)\OPENCV\ML\INCLUDE

C:\PROGRAM FILES (X86)\OPENCV\OTHERLIBS\HIGHGUI

C:\PROGRAM FILES (X86)\OPENCV\OTHERLIBS\CVCAM\INCLUDE

C:\PROGRAM FILES (X86)\OPENCV\CV\INCLUDE

选择Library files

添加以下:

C:\PROGRAM FILES (X86)\OPENCV\LIB

选择Source files

添加以下:

C:\PROGRAM FILES (X86)\OPENCV\CV\SRC

C:\PROGRAM FILES (X86)\OPENCV\CVAUX\SRC

C:\PROGRAM FILES (X86)\OPENCV\CXCORE\SRC

C:\PROGRAM FILES (X86)\OPENCV\OTHERLIBS\HIGHGUI

C:\PROGRAM FILES (X86)\OPENCV\OTHERLIBS\CVCAM\SRC\WINDOWS

完成后建立工程:

文件->新建->工程->Win32 Console Application 然后给 工程命名、位置。

然后在弹出来的窗口 选择“一个Hello,World!”程序。这样就创建成功了。

对工程添加链接库:

工程->设置->连接->对象/库模块

复制粘贴进去

cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

(要注意打空格,否则会导致字母相连,否则会出问题)。

代码测试(可直接 复制运行):

#include "stdafx.h"
#include<cv.h>
#include<highgui.h>
int main(int argc, char* argv[])
{
cvNamedWindow("name");
IplImage* img = cvLoadImage(".\\timg.jpg");
cvShowImage("name",img);

cvWaitKey(0);
        return 0;
}

注意:《图片路径要改的》。

(如果是安装 配置成功的话,会弹出来一个窗口)。

内容:

1.函数 讲解:

(1)cvNamedWindow :创建窗口

函数原型:

int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );

name :

窗口的名字,它被用来区分不同的窗口,并被显示为窗口标题。

flags :

窗口属性标志。目前唯一支持的标志是CV_WINDOW_AUTOSIZE。当这个标志被设置后,用户不能手动改变窗口大小,窗口大小会自动调整以适合被显示图像(参考cvShowImage)。

函数cvNamedWindow创建一个可以放置图像的窗口。被创建的窗口可以通过它们的名字被引用。

如果已经存在这个名字的窗口,这个函数将不做任何事情。

(2)cvLoadImage :从文件中读取图像

函数原型:

IplImage* cvLoadImage( const char* filename, filename ,int flags=CV_LOAD_IMAGE_COLOR)

要被读入的文件的文件名。

flags :

指定读入图像的颜色和深度: );

filename :

要被读入的文件的文件名。

flags :

指定读入图像的颜色和深度:默认为 1,是图片按照本身的大小。int flags=CV_LOAD_IMAGE_COLOR 这句话不用深究,只需要记着默认参数为1,图片大小为本身即可。

(3)cvShowImage :在指定窗口中显示图像 

函数原型:

void cvShowImage( const char* name, const CvArr* image );

name:

窗口的名字。

image:

被显示的图像。

函数cvShowImage 在指定窗口中显示图像。如果窗口创建的时候被设定标志CV_WINDOW_AUTOSIZE,那么图像将以原始尺寸显示;否则,图像将被伸缩以适合窗口大小。

(4)cvWaitKey :等待按键事件

函数原型:

int cvWaitKey( int delay=0 );

delay :

延迟的毫秒数。

函数cvWaitKey无限制的等待按键事件(delay<=0时);或者延迟"delay"毫秒。返回值为被按键的值,如果超过指定时间则返回-1。

(5)cvDestroyWindow :销毁一个窗口 

函数原型:

void cvDestroyWindow( const char* name );

name :

要被销毁的窗口的名字。

函数cvDestroyWindow销毁指定名字的窗口。

(6):获取像素数据:

uchar R = CV_IMAGE_ELEM(image, uchar, y, nChannels * x);

uchar G = CV_IMAGE_ELEM(image, uchar, y, nChannels * x + 1);

ucahr B = CV_IMAGE_ELEM(image, uchar, y, nChannels * x + 2);

CV_IMAGE_ELEM是一个宏,用于获取图像中指定位置的数据。不过令人比较无语的是,OpenCV没有提供直接获取RGB值的方法,RGB三个值各自在内存中的位置需要程序员自己计算(最后一个参数)。

不过据说OpenCV后面扩展的C++接口提供了相应功能。。

CV_IMAGE_ELEM是一个宏,

#define CV_IMAGE_ELEM( image, elemtype, row, col ) \

(((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])

#define CV_MAT_ELEM( mat, elemtype, row, col ) \

(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

但要想正确的得到图像的坐标为(x,y)点的像素值,是应该这样写CV_IMAGE_ELEM(Image, uchar, y, x)

要注意像素点的坐标xy和行列值的顺序是相反的(可以仔细思考为什么)

如果写反:CV_IMAGE_ELEM(Image, uchar, x, y),结果有时候就造成了访问image越界,从而报错。

不过将IMAGE的数据按照原来的样子复制到mat中可以这么写:

CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j)

不用改变顺序

总之,当应用这个宏是如果老报错,就试试换个顺序,或者检查访问的地址是否越界。

为什么乘以3,这里就涉及到傅里叶图像变换了。

想要了解的可以看一下:

http://wenku.baidu.com/link?url=hIQA_vb0A4-JWDD7x6kt79nfQJuSGnditjpEXvcPI4R6esSi33Y8nHRDGuFGCuoIq0y1wULJnozRc9WARcz_7w2UogRV958bG6IQotvTIC_&qq-pf-to=pcqq.c2c

2.在一张 图片上显示另一张图片:

#include "stdafx.h"
#include<cv.h>
#include<highgui.h>
int main(int argc, char* argv[])
{
	int i,j,b,g,r;
	IplImage *img,*bg;
	img=cvLoadImage(".\\timg.jpg");   //要显示的图片
	bg=cvLoadImage(".\\bg.jpg");      //背景图
    int posx=10,posy=10;
	//posx 和poxy是 从背景图的何处开始显示要显示的图片,坐上角为 0 0,(即距离背景图的左上
	// 角X方向10个像素点,y方向 10个像素点的位置开始显示要显示的图片)

    for(i = 0; i < img->height/2; i++)
	{

		// img图片显示一半,i 为0 到img->height/2,含义:img像素点从0 ,到img->height/2的位置都要进行显示
	   	for(j = 0; j < img->width/2; j++)
		{
			b=CV_IMAGE_ELEM(img,uchar,i,j*3+0);
			g=CV_IMAGE_ELEM(img,uchar,i,j*3+1);
			r=CV_IMAGE_ELEM(img,uchar,i,j*3+2);      //得到img  的RGB值

			CV_IMAGE_ELEM(bg,uchar,i+posy,(j+posx)*3+0)=b;
			CV_IMAGE_ELEM(bg,uchar,i+posy,(j+posx)*3+1)=g;
			CV_IMAGE_ELEM(bg,uchar,i+posy,(j+posx)*3+2)=r;
            //这些代码只需要记住就可以了,不用 深究。
			//意思是,先得到img的RGB值,然后将其赋给特定位置的BG图的RGB。这样 就显示上去了。
            //  RGB是工业上 的一种颜色标准,
			//是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,
			//RGB即是代表红、绿、蓝
			//  三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一
		}
	}
	cvNamedWindow("飞机大战");
	cvShowImage("飞机大战",bg);
	cvWaitKey(0);//暂停
	cvDestroyWindow("飞机大战");
	cvWaitKey(0);
	return 0;
}

注意:《图片路径要改的》。

要注意的问题:

一、在背景图上显示另一 张图的时候显示的位置超过了背景图的大小:

造成程序崩溃。例如:背景图的大小为 500×500,如果 非要img图片在背景图上 的显示为位置为:700×700,就会造成崩溃。因为你在 试图找到一个根本找不到的位置。

二、要显示在背景图上的图片大小大于背景图:

造成 程序崩溃。原因:与上面差不多。

3.图片滚动显示:

原理:

首先将背景图复制一份,那么我们就可以将复制 图从下到上(或者 从上到下)一点点的覆盖原图如果覆盖完了,就从头开始执行此过程即可。

图片演示:

那么 我们 就可以使用 十分接近的图来模糊人的肉眼感官,造成图片滚动的错觉。

滚动代码:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
     IplImage *backImage,*backImageClone;                //将要滚动的图片克隆一份
     backImage = cvLoadImage(".\\timg.jpg");
     backImageClone = cvCloneImage(backImage);
     int speed = -1;                                //滚动的速度
     int mpos = 0;
     cvNamedWindow("123");
     while(true)                                    // 动态显示
	 {
       mpos += speed;                               // 随着程序的运行我们计算要刷新显示的长度
       if (mpos<0)
	   {
          mpos = mpos+backImageClone->height;     //如果超过了范围就取模归位
	   }
       for (int i = 0;i<backImage->height;i++)          //将克隆图的一部部分显示在背景图,造成滚动错觉
	   {
          int ti = (mpos+i)%backImageClone->height;
          for (int j= 0;j<backImage->width;j++)
		  {
             int b = CV_IMAGE_ELEM(backImageClone,uchar,ti,j*3);
             int g = CV_IMAGE_ELEM(backImageClone,uchar,ti,j*3+1);
             int r = CV_IMAGE_ELEM(backImageClone,uchar,ti,j*3+2);

             CV_IMAGE_ELEM(backImage,uchar,i,j*3) = b;
             CV_IMAGE_ELEM(backImage,uchar,i,j*3+1) = g;
             CV_IMAGE_ELEM(backImage,uchar,i,j*3+2) = r;
		  }
	   }
       cvWaitKey(20);                             //每20毫秒更新一次显示
       cvShowImage("123",backImage);
	 }
     printf("Hello World!\n");
     return 0;
}

这样就ok了。

注意:《图片路径要改的》。

时间: 2024-08-05 07:30:41

OpenCV做飞机射击类游戏(一)的相关文章

《CrazyBird》Android休闲射击类游戏1.0版发布啦

新游戏新版本首发啦 <CrazyBird>(疯狂的小鸟)1.0版是快开客2015年做的一款休闲射击类游戏,游戏中你需要点击屏幕并拖动手指移动瞄准器,当你对准了小鸟特定位置时战果数加一,每个关卡消灭指定数量小鸟游戏成果,否则失败!欢迎联系我或与我留言提出你宝贵的建议,我将在下一个版本中修正改进! 截图如下: 下载地址如下: 应用宝:http://android.myapp.com/myapp/detail.htm?apkName=com.quickdev.crazybird 木蚂蚁: http:

用cocos2d-html5做的消除类游戏《英雄爱消除》——概述

在bbs.html5china.com论坛学习了MV和老马的小熊蘑菇后我也自己模仿他们做了这样子一个游戏,权当技术交流学习,现在附上游戏截图和源码. 游戏截图: 1.系统菜单界面: 2.游戏界面 3.游戏结束界面: 4.游戏设置页面 这是一款休闲型的游戏,移动方块,相同的方块在一起就会消除,计算消除整个屏幕方块所需要画的时间,时间越短成绩越好.下面附上源码链接: http://files.cnblogs.com/jackyWHJ/HeroLikeClear.zip 接下来会把几个主要功能写个教程

关于Unity中FPS第一人称射击类游戏制作(专题十)

当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 FPS第一人称射击类游戏实例 场景搭建 1.创建Unity项目工程和文件目录,保存场景 2.导入人物模型和子弹碎片的资源包charactor.unitypackage(第74) 3.创建一个平面plane,X和Z拉长10倍,把主角模型Assets\Prefabs\person拉近Hierarchy视图中 4.把走路的声音Step.mp3,射击的声音Shot.mp3,平面贴图Ground.jpg,瞄准的准心贴图Crosshairs.p

用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var STATE_PLAYING = 0; var STATE_GAMEOVER = 1; var g_sharedGameLayer; var GameLayer = cc.Layer.extend({ _time:0, _timeLabel:null, _timeSt

c语言:简单飞机射击小游戏

c语言:简单飞机射击小游戏 使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,操作方法是"a""d""w"或者"←""↑""→"来控制攻击.左.右,击中敌机可获得积分,被敌机撞中死亡一次,每次游戏有3次机会,机会用光则游戏结束,之后可选择是否重新开始游戏. 改进:增加了颜色函数,使得游戏看起来更加的舒适:增加了终止函数,使游戏在死亡三次后自动结束游戏,并且可以选择是否重新开始游戏:

用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var Block = cc.Sprite.extend({ id:0, name:"", active:true, pointX:0, pointY:0, beginPoint:null, flash:false, ctor:function (a

用cocos2d-html5做的消除类游戏《英雄爱消除》(4)——游戏结束

游戏结束界面: 在前面几个教程中,这个界面的创作所需要的知识点基本我们都讲过了,这里就说下用户数据的缓存吧,也是先来看下源码 /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var GameOver = cc.Layer.extend({ init:function () { var bRet = false; if (this._super()) { var sp = cc.Sprite.create(s_b05);

用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ cc.dumpConfig(); var winSize; var SysMenu = cc.Layer.extend({ _hero:null, _logo:null, _logo

非常经典的飞行射击类游戏飞离神庙源码

该游戏源码实现了一款很不错的飞行射击类游戏,飞离神庙游戏,游戏的操作玩法简单,跟我们平时生活中玩的一下射击类的游戏玩法差不多,喜欢android游戏开发的朋友可以下载吧. 源码下载:http://code.662p.com/view/2267.html 详细说明:http://android.662p.com/thread-4584-1-1.html