- //代码为矿大大疆创新实验室比赛时所写,copy一份
-
#include <iostream>
-
#include "opencv2/opencv.hpp"
-
#include "opencv2/imgproc/imgproc.hpp"
-
#include "opencv2/core/core.hpp"
-
#include<stdio.h>
-
#include<math.h>
-
-
#define IMAGE_WIDTH 640 //图像宽度
-
#define IMAGE_HEIGHT 480 //图像高度
-
#define pi 3.14159265 //图像高度
-
-
using namespace cv;
-
using namespace std;
-
-
int main( int argc, char** argv )
-
{
-
// VideoCapture cap("2.avi");
-
VideoCapture cap(0);
-
if ( !cap.isOpened() )
-
{
-
cout << "Cannot open" << endl;
-
return -1;
-
}
-
/***************HSV设置滑动块*************************/
-
int iLowH = 90;
-
int iHighH = 110;
-
-
int iLowS = 90;
-
int iHighS = 255;
-
-
int iLowV = 90;
-
int iHighV = 255;
-
-
namedWindow("Control", CV_WINDOW_AUTOSIZE); //建立调整HSV的窗口"Control"
-
cvCreateTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179)
-
cvCreateTrackbar("HighH", "Control", &iHighH, 179);
-
cvCreateTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)
-
cvCreateTrackbar("HighS", "Control", &iHighS, 255);
-
cvCreateTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)
-
cvCreateTrackbar("HighV", "Control", &iHighV, 255);
-
/*************************************************/
-
//Size s(640, 480);
-
//VideoWriter writer=VideoWriter("imgThresholded.avi",CV_FOURCC('M','J','P','G'), 25, s);//写视频
-
-
//对视频处理并显示
-
while (true)
-
{
-
Mat imgOriginal;
-
bool bSuccess = cap.read(imgOriginal); // 从视频中读取一帧存入矩阵imgOriginal,并检验是否为空
-
if (!bSuccess) //imgOriginal为空,跳出循环
-
{
-
cout << "Cannot read a frame from video stream" << endl;
-
break;
-
}
-
-
/*******************选取目标,与背景分离********************/
-
Mat imgHSV;
-
vector<Mat> hsvSplit;
-
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //取视频的一帧 从BGR 转换到HSV
-
-
//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做
-
split(imgHSV, hsvSplit);
-
equalizeHist(hsvSplit[2],hsvSplit[2]);
-
merge(hsvSplit,imgHSV);
-
Mat imgThresholded;
-
-
//检查imgHSV每一个像素,在Scalar(iLowH, iLowS, iLowV)和Scalar(iHighH, iHighS, iHighV)之间就设置为255,并保存在 imgThresholded图像中,否则为0。
-
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);
-
-
//开操作 (去除一些噪点)
-
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
-
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
-
//闭操作 (连接一些连通域,消除一些空洞)
-
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
-
/*************************************************************/
-
-
int sum=0;
-
for( int i = 0; i < imgThresholded.rows; ++i)
-
{
-
//获取第 i 行首像素指针
-
uchar * p = imgThresholded.ptr<uchar>(i);
-
//对第 i 行的每个像素(byte)操作
-
for( int j = 0; j < imgThresholded.cols; ++j )
-
{
-
sum+=p[j];
-
}
-
}
-
-
if(sum>0) //判断imgThresholded是否为空
-
{
-
/*********************多目标的选取*****************************/
-
//定义轮廓和层次结构
-
vector<vector<Point> > contours;
-
vector<Vec4i> hierarchy;
-
//查找轮廓
-
findContours( imgThresholded, contours, hierarchy,RETR_EXTERNAL, CHAIN_APPROX_NONE );
-
int area, index = 0;
-
int maxIndex=0;
-
int maxArea = 10;
-
//遍历所有轮廓,判断最大轮廓
-
for( ; index >= 0; index = hierarchy[index][0] )
-
{
-
area = fabs(contourArea(contours[index]));
-
if(area > maxArea)
-
{
-
maxIndex=index;
-
maxArea = area;
-
//printf("max area == %i\n", maxArea);
-
}
-
Scalar color(255, 255, 255 );
-
drawContours(imgThresholded, contours, index, color, CV_FILLED, 8, hierarchy );//对轮廓内部着色
-
}
-
/*************************************************************/
-
-
// writer << imgThresholded;
-
/*********************圈定敌方的位置****************************/
-
vector<Point> points;//点值
-
points=contours[maxIndex];
-
-
//对给定的 2D 点集,寻找最小面积的包围矩形
-
Point2f vertex[4];
-
RotatedRect box = minAreaRect(Mat(points));
-
box.points(vertex);
-
/******目标像素位置******/
-
Point2f target=(vertex[0]+vertex[2])*0.5;
-
-
//己方到目标的向量
-
line(imgOriginal, (vertex[0]+vertex[2])*0.5,Point(IMAGE_WIDTH*0.5,IMAGE_HEIGHT), Scalar(0, 255, 0), 2, CV_AA);
-
-
/****************坐标转换*********************/
-
Mat intrinsic_matrix=(Mat_<float>(3,3) << 797.64461,0, 341.87424,0,797.70292,282.35509, 0, 0, 1);
-
Mat rotation_tanslation_matrix=(Mat_<float>(3,3) << 0.021766,0.999506,-88.259736,-0.009815,0.022903,144.411487,-0.999715,0.021537,860.462175);
-
Mat fundamental_matrix= intrinsic_matrix*rotation_tanslation_matrix;
-
fundamental_matrix=fundamental_matrix.inv();
-
-
Mat target3D(3,1,CV_8UC1);
-
Mat target2D=(Mat_<float>(3,1) <<target.x,target.y,1 );
-
target3D= fundamental_matrix*target2D;
-
-
//目标世界坐标
-
float X = target3D.at<float>(0,0)/target3D.at<float>(2,0);
-
float Y = target3D.at<float>(1,0)/target3D.at<float>(2,0);
-
-
// //显示世界坐标
-
// char XText[128],YText[128];
-
// snprintf(XText, sizeof(XText), "%f", X);
-
// snprintf(YText, sizeof(YText), "%f", Y);
-
// putText(imgOriginal,XText,Point(100,90),FONT_HERSHEY_SCRIPT_SIMPLEX, 1,Scalar(0,0,255), 3, 8);
-
// putText(imgOriginal,YText,Point(400,90),FONT_HERSHEY_SCRIPT_SIMPLEX, 1,Scalar(0,0,255), 3, 8);
-
-
Point2f cameraPos=Point(950,150);//相机世界坐标
-
/******************************************/
-
-
target=target-Point2f(IMAGE_WIDTH*0.5,IMAGE_HEIGHT);
-
float angle=-atan(target.x/target.y)*180/pi;
-
float distance=sqrt((cameraPos.x-X)*(cameraPos.x-X)+(cameraPos.y-Y)*(cameraPos.y-Y));
-
char angleText[128],distanceText[128];
-
snprintf(angleText, sizeof(angleText), "%f", angle);
-
snprintf(distanceText, sizeof(distanceText), "%f", distance);
-
-
//将数字绘到画面上
-
putText(imgOriginal,angleText,Point(100,30),FONT_HERSHEY_SCRIPT_SIMPLEX, 1,Scalar(0,0,255), 3, 8);
-
putText(imgOriginal,distanceText,Point(400,30),FONT_HERSHEY_SCRIPT_SIMPLEX, 1,Scalar(0,0,255), 3, 8);
-
-
//绘制出最小面积的包围矩形
-
for( int i = 0; i < 4; i++ )
-
line(imgOriginal, vertex[i], vertex[(i+1)%4], Scalar(100, 200, 211), 2, CV_AA);
-
-
/*************************************************/
-
}
-
else
-
{
-
putText(imgOriginal,"Looking for the enemy.......",Point(90,90),FONT_HERSHEY_PLAIN, 2,Scalar(0,0,255), 2, 8);
-
}
-
imshow("Original", imgOriginal); //原始图片
-
imshow("Thresholded Image", imgThresholded); //二值化图片
-
-
-
char key = (char) waitKey(50);
-
if(key == 27) //esc键退出
-
break;
-
}
-
return 0;
-
}
目标相对位置(返回角度和距离).md
最新推荐文章于 2019-01-29 17:19:21 发布