今天开始尝试写直升机代码。
零号机代码,只考虑鼠标点击等等。暂时不添加拾取框,两台摄像机。
设两台摄像机之间距离为2d,高度为Z。
故摄像头坐标为(-d,0,0),(d,0,0)。
代码思路:
读入图片
↓
畸变矫正
↓
鼠标点击
↓
像素坐标转成世界坐标
↓
转成极坐标
↓
传给单片机
imshow():
void imshow(const string& winname, InputArray mat);
第一个参数是窗口名字,第二个是要显示的图像。
如果窗口是用CV_WINDOW_AUTOSIZE创建的,那么显示图像原始大小;否则将图像进行缩放。
如果图像是16位无符号类型或32位整型,像素值除以256(即把值从[0,255*256]映射到[0,255])。
如果图像是32位浮点型,像素值便要乘以255。值的范围是[0,1]映射到[0,255]。
窗口创建的时候,如果设定了支持OpenGL,那么imshow还支持ogl::Buffer、ogl::Texture2D以及gpu::GpuMat作为输入。
#include "stdafx.h"
using namespace std;
using namespace cv;
int main()
{
Mat A = imread("1.jpg");
imwrite("2.png", A);
return 0;
}
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray
dst, int dtype=-1)
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,gamma,一个加到权重和上的标量值。
第六个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
如果用数学公式来表达,addWeighted函数计算如下两个数组(src1和src2)的加权和,得到结果输出给第四个参数。即addWeighted函数的作用可以被表示为为如下的矩阵表达式为:
dst = src1[I]*alpha+ src2[I]*beta + gamma;
其中的 I 是多维数组元素的索引值。而且,在遇到多通道数组的时候,每个通道都需要独立地进行处理。另外需要注意的是,当输出数组的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。
定义ROI区域(region of interest)
定义ROI区域有两种方法。
第一种是使用cv:Rect.顾名思义,cv::Rect表示一个矩形区域。指定矩形的左上角坐标(构造函数的前两个参数)和矩形的长宽(构造函数的后两个参数)就可以定义一个矩形区域。
Mat imageROI;
imageROI=image(Rect(500,250,logo.cols,logo.rows));
另一种定义ROI的方式是指定感兴趣行或列的范围(Range)。Range是指从起始索引到终止索引(不包括终止索引)的一连段连续序列。cv::Range可以用来定义Range。如果使用cv::Range来定义ROI,那么前例中定义ROI的代码可以重写为:
imageROI=srcImage3(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
综合实验:图像载入、显示、混合与输出
// testtt.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;
using namespace cv;
int main()
{
Mat woman = imread("2.jpg");
namedWindow("woman", WINDOW_AUTOSIZE);
imshow("woman", woman);
Mat man = imread("1.jpg");
imshow("man", man);
Mat imageROI;//ROI即感兴趣区域,Region of interest
imageROI = woman(Range(0, 0 + man.rows), Range(150, 150 + man.cols));
addWeighted(imageROI, 0.5, man, 0.5, 0, woman);
namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", woman);
waitKey(0);
return 0;
}
尝试写第二版本的直升机程序:
双摄像头,认真计算矫正系数。
鼠标响应,给出轮廓,两种情况:圆形和两条线。
写数传(和图传是两个程序)