本文为学习 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