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

    使用外置摄像头时,一定要设置图片格式,即
    VideoCapture invid(0);
    invid.set(CV_CAP_PROP_FRAME_WIDTH, 800);
    invid.set(CV_CAP_PROP_FRAME_HEIGHT, 600);
    否则会出错。

    设置鼠标交互,setMouseCallback()前一定要声明窗口名,即namedWindow,否则setMouseCallback找不到窗口。

    计算相机内参与畸变向量:
    参考书籍:《学习OpenCV》,书中说得很详细。
    关于角点查询与绘制,内参与畸变矩阵的获得,参考7.11的程序。
    http://bbs.dji.com/thread-22089-1-1.html

    argc和argv:
    int类型的argc用来统计程序运行时发送给main函数的命令行参数的个数;第二个参数,char* argv[]为字符串数组,用来存放指向字符串参数的指针数组。
    argv[0]指向程序运行的全路径名。
    argv[1]指向DOS命令行中执行程序名后的第一个字符串。
    其他以此类推。
    argv[argc]为NULL。
    argv[1]对应于“项目属性”->“配置属性”->“调试”->“命令参数”中的值。
    比如如果要读入一张图片,写“1.jpg”;如果要读入两张图片,写“1.jpg” “2.jpg”,中间要加空格。

    imread():
    Mat imread(const string& filename, int flags=1);
    第一个参数是我们需要填入的图片路径名。支持大多数常见类型。
    第二个参数flags是载入标识,指定加载图像的颜色类型,默认值为1。
    -1 原图
    0 灰度图
    1 转换图像到彩色
    2 如果载入的图像深度为16或32位,就返回对应深度的图像,否则就转换为8位图像。
    4 最真实无损的源图像。
    如果输入1 | 2 这种有冲突的数字,则选择较小的数字。
    flags>0 返回一个3通道彩色图像。
    flags=0 返回灰度图像。
    flags<0 返回包含Alpha通道的加载图像。阿尔法通道(Alpha Channel)是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示不透明,白表示透明,灰表示半透明。
    若以彩色模式载入图像,解码后的图像会以BGR的通道顺序进行存储,即蓝绿红的顺序,而不是通常的RGB顺序。


    void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);
    该函数用于创建一个窗口。
    第一个参数是窗口名字。
    第二个参数是窗口的标识,可以填如下几种值。
    WINDOW_NORMAL :设置这个值,用户可以改变窗口大小,基本和改变网页等窗口大小一样。
    WINDOW_AUTOSIZE:窗口大小会自动调整以适应所显示的图像。
    WINDOW_OPENGL:窗口创建的时候会支持OpenGL。
    若是只想展示图片,则可以略去该函数调用;若是在显示窗口之前就用到某个窗口名(比如创建滑动条或者进行鼠标交互),则需要用namedWindow先创建窗口并指定名字。

    imwrite():
    输出图像到文件。
    bool imwrite(const string& filename, InputArray)

     

    串口通信

     1 #using <System.dll>
     2 
     3 using namespace System;
     4 using namespace System::IO::Ports;
     5 using namespace System::Threading;
     6 
     7 int main()
     8 {
     9 //初始化串口,(串口名,波特率,奇偶校验位,数据位,停止位) 
    10 SerialPort^ mySerialPort = gcnew SerialPort("COM5",128000,Parity::None,8,StopBits::One); 
    11 //打开串口
    12 mySerialPort->Open();
    13 
    14 mySerialPort->WriteLine("要写入串口的数据");
    15 //关闭串口
    16 mySerialPort->Close();
    17 }

    有关FileStorage类的研究
    OpenCV通过XML/YAML格式实现数据持久化。
    XML即eXtensible Markup Language,可扩展标识语言。XML是元标记语言,开发者可以根据自身需要定义自己的标记,比如<book><name>。
    YAML即“YAML Ain't a Markup Language”的简写。虽然仍是置标语言,但它以数据为中心。

    写入或者读取数据到XML或YAML文件的操作流程:
    (1)实例化一个FileStorage类对象,用默认带参数的构造函数完成初始化,或者用FileStorage::open()成员函数辅助初始化。
    (2)使用流操作符<<进行文件写入操作,或者>>进行文件读取。
    (3)使用FileStorage::release()函数析构FileStorage类对象,同时关闭文件。

    1.XML/YAML文件的构造:
    FileStorage(const string& source, int flags, const string& encoding=string());
    string的几种情况:
    FileStorage::READ 打开文件进行读操作
    FileStorage::WRITE 打开文件进行写操作
    FileStorage::APPEND打开文件进行附加操作
    FileStorage::MEMORY 从source读数据,或向内部缓存写入数据
    (1)准备文件写操作(两种方式)
    ①FileStorage fs("camera.xml",FileStorage::WRITE);
    ②FileStorage fs;
    fs.open("camera.xml",FileStorage::WRITE);
    (2)准备文件读操作(两种方式)
    ①FileStorage fs("camera.xml",FileStorage::READ);
    ②FileStorage fs;
    fs.open("camera.xml",FileStorage::READ);

    2.进行文件读写操作
    (1)文本和数字的输入和输出
    定义好FileStorage类对象之后,写入文件可以使用"<<"运算符:
    fs << "helicopter" << 100;
    读取文件:
    int hp;
    fs["helicopter"] >> hp;
    个人感觉读写中,文本像是另类的变量名一样,或者说是数据的地址吧。
    (2)OpenCV数据结构的输入和输出
    先初始化,再进行读写。
    到这里的话就够用了。


    initUndistortRectifyMap()函数:
    这个函数似乎用来计算
    CV_EXPORTS_W void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,
    InputArray R, InputArray newCameraMatrix,
    Size size, int m1type, OutputArray map1, OutputArray map2 );

    cameraMatrix——输入的摄像机内参数矩阵
    distCoeffs——输入的摄像机畸变系数矩阵
    R——输入的第一和第二相机坐标系之间的旋转矩阵
    newCameraMatrix——输入的校正后的3X3摄像机矩阵(也可用 cvStereoRectify()得出的3X4的左或右投影矩阵,其实系统会自动提取该矩阵前三列的有用部分作为输入参数)
    size——摄像机采集的无失真图像尺寸
    m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2
    map1——输出的X坐标重映射参数
    map2——输出的Y坐标重映射参数

    摄像头操作的函数
    https://blog.csdn.net/hgz_gs/article/details/50733143

    remap( InputArray src,// 输入图像
    OutputArray dst,// 输出图像
    InputArray map1,InputArray map2,
    int interpolation,// 选择的插值方法,最近邻插值,双线性插值(线性),双三次样条插值等
    int borderMode,// 边界模式,表示目标图像中“离群点”的像素值不会被此函数修改
    const Scalar& borderValue=Scalar()) //有常数边界时使用的值

    map1有两种表示对象:①表示点(x,y)的第一个映射。 ②表示某种类型变量的X值。
    map2同样有两种表示对象:①map1表示(x,y)时,这个参数不表示任何值。 ②表示某种类型变量的Y值。

    bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
    bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
    bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
    bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1

    gemm( InputArray matA, InputArray matB, double alpha,
    InputArray matC, double beta, OutputArray _matD, int flags )
    矩阵乘法:
    D=alpha*A^T*B+beta*C^T

     

     

     

     

     

     

  • 相关阅读:
    MVC 传值
    LINQ to SQL 语句(2)之 Select/Distinct
    LINQ to SQL 语句(1)之 Where
    输入变量相同情况下,结果不正确
    vmware ubuntu 切换终端命令行
    汉字编码问题
    Windows API所提供的功能可以归为七类
    比较好的c++博文
    环境和库的引入
    C#调用Fortran生成的DLL的方法报内存不足
  • 原文地址:https://www.cnblogs.com/Shymuel/p/9303608.html
Copyright © 2011-2022 走看看