#define _CRT_SECURE_NO_WARNINGS//关闭安全检查,须放到最前面
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <Windows.h>
#include <cmath>
#include <stdlib.h>
using namespace cv;
using namespace std;
void CannyDemo(int, void*);
void draw_color(Mat &img);
void draw_garry(Mat &img, int x);//找出物体的中心位置
Mat src,dst,srcGray,result;
int temp0;
int main()
{
while(1)
{
system("adb shell screencap -p /sdcard/autojump.jpg");//控制手机截图
system("adb pull /sdcard/autojump.jpg");//将截图保存
/**
Mat srcImg = imread("C:\\Users\\张新雨\\Desktop\\222\\autojump.jpg");//打开图像
if (srcImg.empty())//判断是否正确打开图片
{
cout << "加载图像失败!" << endl;
return -1;
}
imshow("原图", srcImg);//显示原图
Mat dstImg;
resize(srcImg, dstImg, Size(), 0.25, 0.25);//缩小为原来尺寸的0.5倍
imshow("缩小图片", dstImg);
*/
//system("mspaint autojump.jpg");
//截取截图中的重要部分
IplImage* pSrc = cvLoadImage("./autojump.jpg",-1);
CvSize size= cvSize(1000,900);//区域大小
cvSetImageROI(pSrc,cvRect(20,550,size.width, size.height));//设置源图像ROI
IplImage* pDest = cvCreateImage(size,pSrc->depth,pSrc->nChannels);//创建目标图像
cvCopy(pSrc,pDest); //复制图像
cvResetImageROI(pDest);//源图像用完后,清空ROI
cvSaveImage("Roi.jpg",pDest);//保存目标图像
//显示截图后图片
//cvShowImage("截图",pDest);
//cvWaitKey(0);
cvReleaseImage(&pDest);
cvDestroyWindow("截图");
//找出棋子的位置
IplImage *imgc = cvLoadImage("./Roi.jpg", 1);
uchar *datac = (uchar *)imgc->imageData;
int stepc = imgc->widthStep / sizeof(uchar);
int channelsc = imgc->nChannels;
int Rc, Gc, Bc;
int r0,c0;
bool flag0 = true;
//ofstream fout;
//fout.open("RGB.txt", ios::app);
for(int i = imgc->height-1; i >=0 && flag0==true; i--)
{
for(int j = imgc->width-1; j >=0 && flag0==true; j--)
{
Bc = (int)datac[i * stepc + j * channelsc + 0];
Gc = (int)datac[i * stepc + j * channelsc + 1];
Rc = (int)datac[i * stepc + j * channelsc + 2];
if( Rc==56 && Gc==55 && Bc==95 )
{
r0=i;
c0=j;
temp0=c0;
cout<<r0<<","<<c0<<" chess"<<endl;
flag0 = false;
}
}
}
//对截取图片提取边缘
Mat m_SrcImg;
m_SrcImg = imread("./Roi.jpg", -1);
//namedWindow("原图像", 1);
//imshow("原图像", m_SrcImg);
Mat m_ResImg;
//Canny边缘检测
Canny(m_SrcImg, m_ResImg, 50, 150, 3);
//namedWindow("Canny边缘检测", 1);
//imshow("Canny边缘检测", m_ResImg);
//waitKey(0);
//将Mat转为IplImage并存储
IplImage qImg;
qImg = IplImage(m_ResImg);
cvSaveImage("./outcanny.jpg", &qImg);
//system("mspaint outcanny.jpg");
//遍历图片找落点有效像素点
double timeConsume = static_cast<double>(getTickCount());
IplImage *img = cvLoadImage("./outcanny.jpg", 1);
uchar *data = (uchar *)img->imageData;
int step = img->widthStep / sizeof(uchar);
int channels = img->nChannels;
int R, G, B;
int r1,c1,r2,c2,temp;
bool flag = true;
temp=temp0;
if(temp>500)
{
for(int i = 0; i < img->height && flag==true; i++)
{
for(int j = 0; j < img->width/2 && flag==true; j++)
{
B = (int)data[i * step + j * channels + 0];
G = (int)data[i * step + j * channels + 1];
R = (int)data[i * step + j * channels + 2];
if( R==255 && G==255 && B==255 )
{
r1=i;
c1=j;
cout<<r1<<","<<c1<<" up"<<endl;
//fout << "( " << i << ", " << j << " ) = ( " << R << "," << G << "," << B << ")" << endl;
//下界
/*
for(int i = r1+5; i < img->height && flag==true; i++)
{
for(int j = c1; j <= c1 && flag==true; j++)
{
B = (int)data[i * step + j * channels + 0];
G = (int)data[i * step + j * channels + 1];
R = (int)data[i * step + j * channels + 2];
if( R==255 && G==255 && B==255 )
{
r2 = i;
c2 = j;
cout<<r2<<","<<c2<<" down"<<endl;
flag=false;
}
}
}
*/
flag=false;
}
}
}
}
else
{
for(int i = 0; i < img->height && flag==true; i++)
{
for(int j = 500; j < img->width && flag==true; j++)
{
B = (int)data[i * step + j * channels + 0];
G = (int)data[i * step + j * channels + 1];
R = (int)data[i * step + j * channels + 2];
if( R==255 && G==255 && B==255 )
{
r1=i;
c1=j;
cout<<r1<<","<<c1<<" up"<<endl;
flag=false;
}
}
}
}
IplImage *img2 = cvLoadImage("./outcanny.jpg", 1);
uchar *data2 = (uchar *)img2->imageData;
int step2 = img2->widthStep / sizeof(uchar);
int channels2 = img2->nChannels;
/*
for(int i = r1+5; i < img2->height && flag==true; i++)
{
for(int j = c1; j <=c1 && flag==true; j++)
{
B = (int)data2[i * step2 + j * channels2 + 0];
G = (int)data2[i * step2 + j * channels2 + 1];
R = (int)data2[i * step2 + j * channels2 + 2];
if( R==255 && G==255 && B==255 )
{
r2=i;
c2=j;
cout<<r2<<","<<c2<<" ="<<endl;
//fout << "( " << i << ", " << j << " ) = ( " << R << "," << G << "," << B << ")" << endl;
flag=false;
}
}
}
*/
timeConsume = ((double)getTickCount() - timeConsume) / getTickFrequency();
cout << "单步耗时: " << timeConsume << endl;
waitKey(0);
//计算距离
int rmid=0;
rmid=r1+70;
/*
rmid=(r2-r1)/2+r1;
if(rmid-r1<160)
rmid=r1+160;
if(r2-rmid<140)
rmid=r2-140;
*/
int S = (int)sqrt((r0 - rmid)*(r0 - rmid) + (c0 - c1)*(c0 - c1));
cout<<S<<"-S-"<<endl;
int dis=S*133/100;
cout<<dis<<"-dis-"<<endl;
char ch[50];
//把按压时间与命令放到一个字符串上
sprintf(ch, "adb shell input swipe 320 410 310 410 %d", dis);
//用system命令输入
system(ch);
cout << ch << endl;
/*
//声明IplImage指针
IplImage* img = NULL;
IplImage* cannyImg = NULL;
char *filename;
filename="C:\\Users\\张新雨\\Desktop\\222\\Roi.jpg";
img=cvLoadImage(filename,1);
//载入图像,强制转化为Gray
if((img = cvLoadImage(filename, 0)) != 0 )
{
//为canny边缘图像申请空间
cannyImg = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//canny边缘检测
cvCanny(img, cannyImg, 50, 150, 3);
//创建窗口
cvNamedWindow("src", 1);
cvNamedWindow("canny",1);
//显示图像
cvShowImage( "src", img );
cvShowImage( "canny", cannyImg );
cvWaitKey(0); //等待按键
//销毁窗口
cvDestroyWindow( "src" );
cvDestroyWindow( "canny" );
//释放图像
cvReleaseImage( &img );
cvReleaseImage( &cannyImg );
}
*/
/**
Mat img = imread("..\\Roi.jpg");
cvtColor(img,img,3||4);
Mat contours;
Canny(img,contours,125,350);
threshold(contours,contours,128,255,THRESH_BINARY);
namedWindow("Canny");
imshow("Canny",contours);
waitKey();
*