OpenCV——运用于pixels war游戏
// The "Square Detector" program.
// It loads several images sequentially and tries to find squares in
// each image #include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp" #include <iostream>
#include <math.h>
#include <string.h>
#include <vector> using namespace cv;
using namespace std; static void help()
{
cout <<
"\nA program using pyramid scaling, Canny, contours, contour simpification and\n"
"memory storage (it's got it all folks) to find\n"
"squares in a list of images pic1-6.png\n"
"Returns sequence of squares detected on the image.\n"
"the sequence is stored in the specified memory storage\n"
"Call:\n"
"./squares\n"
"Using OpenCV version %s\n" << CV_VERSION << "\n" << endl;
} int thresh = , N = ;
const char* wndname = "Square Detection Demo"; // helper function:
// finds a cosine of angle between vectors
// from pt0->pt1 and from pt0->pt2
static double angle( Point pt1, Point pt2, Point pt0 )
{
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-);
} // returns sequence of squares detected on the image.
// the sequence is stored in the specified memory storage
static void findSquares( const Mat& image, vector<vector<Point> >& squares )
{
squares.clear(); Mat pyr, timg, gray0(image.size(), CV_8U), gray; // down-scale and upscale the image to filter out the noise
pyrDown(image, pyr, Size(image.cols/, image.rows/));
pyrUp(pyr, timg, image.size());
vector<vector<Point> > contours; // find squares in every color plane of the image
for( int c = ; c < ; c++ )
{
int ch[] = {c, };
mixChannels(&timg, , &gray0, , ch, );//分别将r,g,b三个通道的内容拷贝到gray0通道 // try several threshold levels
for( int l = ; l < N; l++ )
{
// hack: use Canny instead of zero threshold level.
// Canny helps to catch squares with gradient shading
if( l == )
{
// apply Canny. Take the upper threshold from slider
// and set the lower to 0 (which forces edges merging)
Canny(gray0, gray, , thresh, );
// dilate canny output to remove potential
// holes between edge segments
dilate(gray, gray, Mat(), Point(-,-)); }
else
{
// apply threshold if l!=0:
// tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0
gray = gray0 >= (l+)*/N;
} // find contours and store them all as a list
//imshow("temp",gray);
findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); vector<Point> approx; // test each contour
for( size_t i = ; i < contours.size(); i++ )
{
// approximate contour with accuracy proportional
// to the contour perimeter
approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); // square contours should have 4 vertices after approximation
// relatively large area (to filter out noisy contours)
// and be convex.
// Note: absolute value of an area is used because
// area may be positive or negative - in accordance with the
// contour orientation int a=approx.size();
int b=abs(contourArea(Mat(approx)));
bool c=isContourConvex(Mat(approx));
if( approx.size() == &&
fabs(contourArea(Mat(approx))) > &&fabs(contourArea(Mat(approx)))<&&
isContourConvex(Mat(approx)) )
{
double maxCosine = ; for( int j = ; j < ; j++ )
{
// find the maximum cosine of the angle between joint edges
double cosine = fabs(angle(approx[j%], approx[j-], approx[j-]));
maxCosine = MAX(maxCosine, cosine);
} // if cosines of all angles are small
// (all angles are ~90 degree) then write quandrange
// vertices to resultant sequence
if( maxCosine < 0.5 )
squares.push_back(approx);
}
}
}
}
} // the function draws all the squares in the image
static void drawSquares( Mat& image, const vector<vector<Point> >& squares )
{
//vector<Point> pointsToTest;
vector<int> valueOfChannel0/*,valueOfChannel1,valueOfChannel2*/;
int differentPoint,normalPoint,tempPoint=;
bool setDifferentPoint=;
//bool setNormalPoint=0; for( size_t i = ; i < squares.size(); i++ )
{
const Point* p = &squares[i][];
int n = (int)squares[i].size(); //////////////////////////////////////////////////////////////////////////////////////////////
Point middlePoint((squares[i][].x+squares[i][].x)/,(squares[i][].y+squares[i][].y)/);
//pointsToTest.push_back(middlePoint);
tempPoint=(int)image.at<Vec3b>(middlePoint.y,middlePoint.x)[];
//cout<<tempPoint<<endl;
if (==i)
{
normalPoint=tempPoint;
polylines(image, &p, &n, , true, Scalar(,,), , CV_AA);
}
else
{
if (tempPoint!=normalPoint)
{
if (!setDifferentPoint)
{
differentPoint=tempPoint;
setDifferentPoint=;
}
polylines(image, &p, &n, , true, Scalar(,,), , CV_AA);
}
else
{
polylines(image, &p, &n, , true, Scalar(,,), , CV_AA);
} } } imshow(wndname, image);
} int main(int /*argc*/, char** /*argv*/)
{
static const char* names[] = { "Image 001.png", "Image 002.png", "Image 003.png",
"Image 004.png", "Image 005.png", "Image 006.png","Image 007.png", };
help();
namedWindow( wndname, );
vector<vector<Point> > squares; for( int i = ; names[i] != ; i++ )
{
Mat image = imread(names[i], );
if( image.empty() )
{
cout << "Couldn't load " << names[i] << endl;
continue;
} findSquares(image, squares);
drawSquares(image, squares); int c = waitKey();
if( (char)c == )
break;
remove("Image 001.png");
} return ;
}
OpenCV——运用于pixels war游戏的更多相关文章
- (原创).Net将EF运用于Oralce一 准备工作
网上有很多EF运用于Oracle的博文,但是找了半天发现大多数博文大都语焉不详,于是决定自己折腾. 首先我的开发工具为vs2010,那么最适用于VS2010的EF版本为多少呢?答案是EF5.我在Sta ...
- 【4opencv】CLR基本原理和如何运用于GOCW
GOCW的重点和难点就在于Csharp调用OpenCV,其中的桥梁就是CLR,当然我们也有其他方法,但是CLR是一个比较新的.比较可靠的.关键是能用的桥梁.这里关于CLR的基本原理知识.如何用于GOC ...
- 用于部署war并重启Tomcat的脚本
只需要定义两个变量, 一个是目标tomcat实例的目录, 另一个是war包的名称 # Please define the absolute path of tomcat instance THIS_T ...
- 知识图谱如何运用于RecomSys
将知识图谱作为辅助信息引入到推荐系统中可以有效地解决传统推荐系统存在的稀疏性和冷启动问题,近几年有很多研究人员在做相关的工作.目前,将知识图谱特征学习应用到推荐系统中主要通过三种方式——依次学习.联合 ...
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
- distri.lua的web运维工具
我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上. 回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏 ...
- 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
- 云游戏学习与实践(二)——安装GamingAnywhere
安装GamingAnywhere 一.GamingAnywhere项目 GamingAnywhere是一个开源的实现云游戏的引擎,并且高效.跨平台.易扩展.可调配. GitHub地址:https:// ...
- 虚拟现实外包公司—VR游戏你不知道的以及你该知道的WebVR
VR基础——原理其实很简单 我们地球人之所以能够看到立体的景物,是因为双眼可以各自独立看东西,也就是左眼只能看到左眼的景物,而右眼只能看到右眼的景物.因为人类左右两眼有间距,造成两眼的视角有些细微的差 ...
随机推荐
- 更新sdk
更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetched Ad ...
- 4.请求方式为application/json时的接口测试要如何做?
1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...
- 【转】MapReduce的优化
相信每个程序员在编程时都会问自己两个问题“我如何完成这个任务”,以及“怎么能让程序运行得更快”.同样,MapReduce计算模型的多次优化也是为了更好地解答这两个问题. MapReduce计算模型的优 ...
- java 中文乱码
1.URL编码 String str = URLEncoder.encode("中文乱码","UTF-8");//编码 String newStr = URLD ...
- unity 组件开发
//在unit菜单加入Component->b2Components->b2BodyComponent [AddComponentMenu("b2Components/b2Bod ...
- BeautifulSoup抓取列表页锚文本
素闻BeautifulSoup提取效率低,艾玛,第一印象果然是很要命的,反正比Re 和 Lxml 是要慢的,不过就无奈Re的正则折腾来折腾去,没写出来,Lxml 的 Xpath 又用得不好. 不过就这 ...
- openstack私有云布署实践【4.2 上层代理haproxy+nginx配置 (办公网测试环境)】
续上一节说明 一开始我也是使用haproxy来做的,但后来方式改了,是因为物理机controller的高配置有些浪费,我需要1组高可用的上层nginx代理服务器来实现其它域名80代理访问,很多办公网测 ...
- ORACLE 11g dblink 配置升级
1.如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: select * from user_sys_privs where privilege like upper('% ...
- 5. Java反射机制
Java反射机制 问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的R ...
- UESTC 1272 Final Pan's prime numbers(乱搞)
题目链接 Description Final Pan likes prime numbers very much. One day, he want to find the super prime n ...