OpenCV3基本数据

本文为学习 Learning OpenCV 3 Computer vision in C++ 第三章的笔记。

主要内容

本章主要介绍了基本数据,如point,size,vector,scalar,rector,matrix等。和一些helper函数。OpenCV的C++版中深度使用了 template,因此需要正确地使用 primitive type 来创建类。
本周的内容需要多实践,下面把习题对应的代码贴一下。
题目主要包含:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main (int argc, char*argv[]){
    //1
    //
    Point2f p1 = Point2f(3.2,2.3);
    float num = 2.33;
    Point2f p2 = Point2f();
    p2.x = num;
    p2.y = num;
    cout<< "p1: " << p1 <<", p2: "<<p2<<endl;
    //
    Point p3 = p1;
    cout<< "p3: " << p3 <<endl;
    Point2f p4 = Point2f(p3);
    cout<< "p4: " << p4 <<endl;
    // 注意 cvRound(2.5) = 2;
    cout<< cvRound(2.5)<<", "<< cvCeil(2.5) <<", "<<cvFloor(2.9)<<endl;
    //
    cout<<"Random num: " <<randu<uint16_t>()<<endl;
    cout<<"Random num: " <<randu<uint16_t>()<<endl;

    //2
    Matx33f matf1 = Matx33f();//Matx33f::eye();
    randu(matf1, 1, 3);
    cout<<"matf1: "<< matf1<<endl;
    cout<<matf1(1,2)<<";"<<matf1.row(1)<<endl;

    Vec3f vecf1 = Vec3f(1,2,3);
    cout<<"vecf1:"<<vecf1<<endl;

    // cout<<"multiplication:"<<vecf1.mul(matf1)<<endl;//build error

    //3
    Matx<int, 3,3> m33d = Matx<int, 3, 3>(1,2,3,4,5,6,7,8,9);
    cout<<"m33d: "<< m33d<<endl;
    Vec<int, 3> v3d = Vec<int, 3> (1,2,3);
    cout<<"v3d: "<< v3d<<endl;
    cout<<"product:"<<m33d * v3d<< endl;
    // v3d * m33d;
    // ((Matx<int,3,1>)v3d).mul(m33d);
    Matx<int, 3, 1> m31d = Matx<int, 3, 1>(v3d);
    cout<<"m31d:"<< m31d<<endl;
    cout<<m33d * m31d<<endl;;

    return 0;
}

问题

matrix 和 vector 相乘的问题。首先 mul 函数是相同位置的元素相乘,因此需要两个变量的维数相同。 涉及matrix的相乘直接使用 *即可。但有不明白的地方在于 matrix 和 vector相乘——因为根据我的理解矢量是一维的,那么 v3d 的维度应该是 1x3,应该使用: v3d * m33d。可是实际上m33d * v3d才能运行,而使用 v3d * m33d,则报错。后来,注意到书中提到 3-row vector,因此在 opencv 中是 nx1 的。

Comments