// 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. win10锁屏壁纸路径

    C:\Users\ShanYu\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalS ...

  2. Linux的文件/目录的权限

    文件类型 权限 属主 属组 目录名/文件名drwx------ 2 alice girls 4096 9月 25 11:33 alicedrwx------ 2 rose girls 4096 9月 ...

  3. Javaweb 第12天 JSP、EL技术

    第12天 JSP.EL技术 今日任务: JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 课堂笔记 1.JSP技术入门和常用指令 1.1.JSP的由来. ...

  4. Django 过滤器

    过滤器 描述 示例 upper 以大写方式输出 {{ user.name | upper }} add 给value加上一个数值 {{ user.age | add:"5" }} ...

  5. iOS二维码条形码的制作

    - (IBAction)creatQRImage:(id)sender { [self.textField resignFirstResponder]; //这里是我放了个TextField的控件,但 ...

  6. PAT 团体程序设计天梯赛-练习集 L1-019. 谁先倒

    给出甲.乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒. 输入格式: 输入第一行先后给出甲.乙两人的酒量(不超过100的非负整数),以空格分隔.下一行给出一个正整数N(<=1 ...

  7. jQuery第五章

    jQuery对表单.表格的操作以及更多应用 一.表单应用 1.单行文本框应用 (1)获取和失去焦点改变样式 HTML代码如下: <form action="#" method ...

  8. POJ 2505 A multiplication game(找规律博弈/贪心)

    题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; int ...

  9. Java IO 过滤流 BufferedInput/OutputStream

    Java IO 过滤流 BufferedInput/OutputStream @author ixenos 概念 BufferedInput/OutputStream是实现缓存的过滤流,他们分别是Fi ...

  10. Computation expressions: Introduction

    本文仅为对原文的翻译,主要是记录以方便以后随时查看.原文地址为http://fsharpforfunandprofit.com/posts/computation-expressions-intro/ ...