// 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游戏的更多相关文章

  1. (原创).Net将EF运用于Oralce一 准备工作

    网上有很多EF运用于Oracle的博文,但是找了半天发现大多数博文大都语焉不详,于是决定自己折腾. 首先我的开发工具为vs2010,那么最适用于VS2010的EF版本为多少呢?答案是EF5.我在Sta ...

  2. 【4opencv】CLR基本原理和如何运用于GOCW

    GOCW的重点和难点就在于Csharp调用OpenCV,其中的桥梁就是CLR,当然我们也有其他方法,但是CLR是一个比较新的.比较可靠的.关键是能用的桥梁.这里关于CLR的基本原理知识.如何用于GOC ...

  3. 用于部署war并重启Tomcat的脚本

    只需要定义两个变量, 一个是目标tomcat实例的目录, 另一个是war包的名称 # Please define the absolute path of tomcat instance THIS_T ...

  4. 知识图谱如何运用于RecomSys

    将知识图谱作为辅助信息引入到推荐系统中可以有效地解决传统推荐系统存在的稀疏性和冷启动问题,近几年有很多研究人员在做相关的工作.目前,将知识图谱特征学习应用到推荐系统中主要通过三种方式——依次学习.联合 ...

  5. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  6. distri.lua的web运维工具

    我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上. 回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏 ...

  7. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  8. 云游戏学习与实践(二)——安装GamingAnywhere

    安装GamingAnywhere 一.GamingAnywhere项目 GamingAnywhere是一个开源的实现云游戏的引擎,并且高效.跨平台.易扩展.可调配. GitHub地址:https:// ...

  9. 虚拟现实外包公司—VR游戏你不知道的以及你该知道的WebVR

    VR基础——原理其实很简单 我们地球人之所以能够看到立体的景物,是因为双眼可以各自独立看东西,也就是左眼只能看到左眼的景物,而右眼只能看到右眼的景物.因为人类左右两眼有间距,造成两眼的视角有些细微的差 ...

随机推荐

  1. Java 语言的 XPath API

    如果要告诉别人买一加仑牛奶,您会怎么说?"请去买一加仑牛奶回来" 还是 "从前门出去,向左转,走三个街区向右转,再走半个街区向右转进入商店.走向四号通道,沿通道走五米向左 ...

  2. PhotonServer 学习

    版本:Photon-OnPremise-Server-SDK_v3-4-31-10808 输出文件夹:deploy/名称/bin PhotonServer.config 配置 <Applicat ...

  3. 浅谈Objective-C对象初始化的三类程序猿

    序 早上看了位仁兄写了<Swift:让人眼前一亮的初始化方式>的文章.什么?!初始化?Objective-C!好吧,吓哔哔~~~ 一.普通程序猿 普通程序员使用最常见路人姿势等场.普普通通 ...

  4. 5个可用提高Godaddy主机速度的第三方CDN加速服务商

    毕竟Godaddy主机数据中心位于美国.新加坡.欧洲三个数据中心,一般我们都会选择美国数据中心,相比较其他2个机房的速度是快和稳定的,很多人要说为什么新加坡数据中心速度不好呢?因为目前的新加坡机房不是 ...

  5. 在js中拼接<a>标签,<a>标签中含有onclick事件,点击无法触发该事件

    我们在<a>标签中添加事件一般是onclick="editUser()" 这样添加,在html页面上是行的通的 但是如何你是在js中拼接<a>标签并在< ...

  6. hdu 3986 Harry Potter and the Final Battle

    一个水题WA了60发,数组没开大,这OJ也不提示RE,光提示WA...... 思路:先求出最短路,如果删除的边不是最短路上的,那么对结果没有影响,要有影响,只能删除最短路上的边.所以枚举一下最短路上的 ...

  7. 说说SACC2016第八届架构师大会

    每年这方面的会议很多,不知不觉已经连续举办八年了.一届比一届办的有质量,规模越大.今年也如约而至.2016-10-27在北京万达索菲特酒店.4000多人规模,云集各领域顶尖架构师,运维,云计算,技术专 ...

  8. Constraint where both columns cannot be null, but one can

    ALTER TABLE TableA ADD CONSTRAINT CK_BothDepartsNotNull CHECK (departA IS NOT NULL OR departB IS NOT ...

  9. putty 窗口管理

    (一个用户,可以有多个小窗口) screen -S xxx   保存用户名(用户丢失后新保存) screen -ls 查询现有的screen screen -r zxc 恢复 ctrl+a+c 新增小 ...

  10. 利用yield关键字输出杨辉三角

    最近学习了下python,发现里面也有yield的用法,本来对C#里的yield不甚了解,但是通过学习python,对于C#的yield理解更深了!! 不多说了,小学生水平的表达能力伤不起.... 直 ...