2016年3月15日 星期二

Basic Matrix Operation on OpenCV

Basic Matrix Operation 基本矩陣運算

在使用OpenCV時常常會操作cv::Mat陣列,以下會列出常使用到的情況。

如何建立矩陣

直接宣告矩陣大小及型態

Mat image(240, 320, CV_8UC3);

重新分配矩陣大小

image.create(480, 640, CV_8UC3);

建立矩陣時,同時給予初始值

宣告矩陣並將所有值設成5

Mat A33(3, 3, CV_32F, Scalar(5));

宣告所有值都是1的矩陣,再將所有值乘5

Mat B33 = Mat::ones(3, 3, CV_32F)*5.;

宣告所有值都是0的矩陣,再將所有值加5

Mat C33 = Mat::zeros(3, 3, CV_32F) + 5.;

宣告指定數值的矩陣

Mat A22 = (Mat_<float>(2,2) << 5, -15, 20, -15);

宣告矩陣並給予指定矩陣

float B22data[] = { 5, -15, 20, -15};
Mat B22 = Mat(2, 2, CV_32F, B22data).clone();

宣告隨機分佈的亂數值

cv::Mat vec01 = cv::Mat::zeros(1, 10, CV_8U); 
cv::randu(vec01, cv::Scalar(0), cv::Scalar(256));

宣告高斯分佈的亂數值

cv::Mat vec02 = cv::Mat::zeros(1, 10, CV_8U); 
cv::randn(vec02, cv::Scalar(128), cv::Scalar(10));

不複製記憶體的方式轉移矩陣資料

cv::Mat轉換成cv::Mat

Mat image_alias = image;

將一般陣列轉換成cv::Mat

float* Idata = new float[480*640*3];
Mat I(480, 640, CV_32FC3, Idata);

vector陣列轉換成cv::Mat

vector<Point> iptvec(10);
Mat dstMat(iptvec); 

IplImage轉換成cv::Mat

IplImage* iMG = cvCreateImage(cvSize(320,240), 16, 1);
Mat dstMat = cvarrToMat(iMG);

cv::Mat轉換成IplImage

Mat srcMat;
IplImage iMG = srcMat; 

cv::Mat轉換成CvMat

Mat srcMat;
CvMat dstCvMat = srcMat;

複製記憶體的方式轉移矩陣資料

IplImage複製給cv::Mat

IplImage* iMG = cvCreateImage(cvSize(320,240), 16, 1);  
Mat dstMat = cvarrToMat(iMG).clone();

cv::Mat複製給vector

Mat srcMat;
vector<Point2f> ptvec = Mat_<Point2f>(srcMat);

cv::Mat 合併、插入、移除

cv::Mat hMat(5,1,CV_8UC1,cv::Scalar(2));
cv::Mat sMat(5,1,CV_8UC1,cv::Scalar(5));

cv::Mat tmpMat(5,2, CV_8UC1 );
hMat.copyTo( tmpMat.col(0) );
sMat.copyTo( tmpMat.col(1) );

/*
  25
  25
  25
  25
  25
*/

合併cv::Mat

cv::Mat mat1(1,3, CV_8UC1,cv::Scalar(2));
cv::Mat mat2(2,3, CV_8UC1,cv::Scalar(3));
cv::Mat matM;
matM.push_back(mat1);
matM.push_back(mat2);
/*
  222
  333
  333
*/

型態轉換(int、float、double)

** CV_8UC1 to CV_32FC1

cv::Mat mat8U(3,2,CV_8UC1,cv::Scalar(2));
cv::Mat mat32F;
mat8U.convertTo(mat32F, CV_32FC1);

陣列運算cv::Mat

計算陣列中非0值的數量

cv::Mat src(5,3,CV_8UC1, cv::Scalar(3));
int total = cv::countNonZero(src);
std::cout<<total; //15

更多OpenCV文章請參考:OpenCV Tutorial (學習筆記)

0 意見:

張貼留言