zoukankan      html  css  js  c++  java
  • OpenCV学习(7.13)

    今天开始尝试写直升机代码。
    零号机代码,只考虑鼠标点击等等。暂时不添加拾取框,两台摄像机。
    设两台摄像机之间距离为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;
    }

    尝试写第二版本的直升机程序:
    双摄像头,认真计算矫正系数。
    鼠标响应,给出轮廓,两种情况:圆形和两条线。
    写数传(和图传是两个程序)

  • 相关阅读:
    shell编程-项目部署(优化篇)
    数据库相关
    python基础面试
    scrapy爬取数据进行数据库存储和本地存储
    C# 对字符串操 替换数字 替换非数字 去除首尾字符 长沙
    还在为删除集合中的相同项而烦恼吗?
    C#之Task&匿名方法
    如何在火狐里面实现如下功能
    valueOf和toString曾经欺骗过你吗?
    JS 实现Json查询方法
  • 原文地址:https://www.cnblogs.com/Shymuel/p/9316313.html
Copyright © 2011-2022 走看看