(1)利用数组来构建cv::Mat
示例代码如下所示:
- void ArrayToMat()
- {
- double m[3][3];
- for (int i=0; i<3; i++)
- {
- for (int j=0; j<3; j++)
- {
- m[i][j] = i+j;
- cout<<m[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<"****************************************"<<endl;
- Mat M = Mat(3, 3, CV_64F, m);
- double tempVal = 0.0;
- for (int i=0; i<3; i++)
- {
- for (int j=0; j<3; j++)
- {
- tempVal = M.at<double>(i,j);
- cout<<tempVal<<" ";
- }
- cout<<endl;
- }
- }
不出意外的话,执行结果应该如下所示:
(2) IplImage*跟cv::Mat之间的互相转换
示例代码:
- void IplImageToMat()
- {
- IplImage* pImg = cvLoadImage("c:/test.jpg");
- if (!pImg)
- {
- cout<<"pImg load error"<<endl;
- system("pause");
- exit(-1);
- }
- cvNamedWindow("pImg", 0);
- cvNamedWindow("mtx", 0);
- Mat mtx(pImg);
- cvShowImage("pImg", pImg);
- imshow("mtx", mtx);
- cvWaitKey(0);
- cvReleaseImage(&pImg);
- }
笔者任意加载了电脑上一副图片,结果如下所示:
提醒,这里的格式转换并不申请新的内存,而仅仅是改变数据结构而已
(3)Mat转换为IplImge
示例代码:
- void MatToIplImage()
- {
- Mat m = imread("c:/test.jpg");
- if (m.empty())
- {
- cout<<"mat load error"<<endl;
- system("pause");
- exit(-1);
- }
- IplImage img1 = IplImage(m);
- IplImage img2 = m;
- cvNamedWindow("img1", 0);
- cvNamedWindow("img2", 0);
- cvShowImage("img1", &img1);
- cvShowImage("img2", &img2);
- cvWaitKey(0);
- }
笔者任意加载一张图片,上述代码的执行结果为:
(4)访问二维数据(cv::Mat)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问
示例代码:
- void MatAccess()
- {
- double m[3][3];
- for (int i=0; i<3; i++)
- {
- for (int j=0; j<3; j++)
- {
- m[i][j] = i+j;
- cout<<m[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<"****************************************"<<endl;
- Mat M = Mat(3, 3, CV_64F, m);
- double sum = 0;
- int rows = M.rows;
- int cols = M.cols;
- for (int i=0; i<rows; i++)
- {
- const double* Mi = M.ptr<double>(i);
- for (int j=0; j<cols; j++)
- {
- sum += Mi[j];
- }
- }
- cout<<"sum: "<<sum<<endl;
- }
上面的代码执行结果为:
(5)cv::Mat支持STL中的迭代器功能
示例代码:
- void MatAccess()
- {
- double m[3][3];
- for (int i=0; i<3; i++)
- {
- for (int j=0; j<3; j++)
- {
- m[i][j] = i+j;
- cout<<m[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<"****************************************"<<endl;
- Mat M = Mat(3, 3, CV_64F, m);
- double sum = 0;
- int rows = M.rows;
- int cols = M.cols;
- for (int i=0; i<rows; i++)
- {
- const double* Mi = M.ptr<double>(i);
- for (int j=0; j<cols; j++)
- {
- sum += Mi[j];
- }
- }
- cout<<"sum: "<<sum<<endl;
- sum = 0;
- MatConstIterator_<double> it = M.begin<double>();
- MatConstIterator_<double> itEnd = M.end<double>();
- for (;it!=itEnd; it++)
- {
- sum += *it;
- }
- cout<<"sum: "<<sum<<endl;
- }
运行结果:
(6) satureat_cast : openCV中用于数据“饱和”判断
示例:
- void Saturate_castTest()
- {
- int r = 300;
- uchar t = saturate_cast<uchar>(r);
- cout<<int(t)<<endl;
- }
结果:
(7)获取函数执行时间
getTickCount()和getTickFrequency()结合起来可以用来计算函数执行时间,尤其是很小的代码片段的执行时间
举例:
- void GetFuncTime()
- {
- double exec_time = (double)getTickCount();
- for (int i=0; i<10; i++)
- {
- ;
- }
- exec_time = ((double)getTickCount() - exec_time)*1000./getTickFrequency();
- cout<<exec_time<<endl;
- }
上面的代码,重点在于for循环,且,该循环中什么也不处理;用一般的时间函数很难计算出该代码片段的执行时间,但利用getTickCount()和getTickFrequency()就很容易。笔者电脑上的结果是: