今天开始尝试写直升机代码。
零号机代码,只考虑鼠标点击等等。暂时不添加拾取框,两台摄像机。设两台摄像机之间距离为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;}
尝试写第二版本的直升机程序:
双摄像头,认真计算矫正系数。鼠标响应,给出轮廓,两种情况:圆形和两条线。写数传(和图传是两个程序)