OpenCV的几个小技巧
2013-04-30 09:45
666 查看
申明:以下的小技巧,均为OpenCV2.4.2下验证过的,但并不保证其它版本依然奏效(1)利用数组来构建cv::Mat 示例代码如下所示:
不出意外的话,执行结果应该如下所示:
(2) IplImage*跟cv::Mat之间的互相转换示例代码:
笔者任意加载了电脑上一副图片,结果如下所示:
提醒,这里的格式转换并不申请新的内存,而仅仅是改变数据结构而已(3)Mat转换为IplImge示例代码:
笔者任意加载一张图片,上述代码的执行结果为:
(4)访问二维数据(cv::Mat)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问示例代码:
上面的代码执行结果为:
(5)cv::Mat支持STL中的迭代器功能示例代码:
运行结果:
(6) satureat_cast : openCV中用于数据“饱和”判断示例:
结果:
(7)获取函数执行时间getTickCount()和getTickFrequency()结合起来可以用来计算函数执行时间,尤其是很小的代码片段的执行时间举例:
上面的代码,重点在于for循环,且,该循环中什么也不处理;用一般的时间函数很难计算出该代码片段的执行时间,但利用getTickCount()和getTickFrequency()就很容易。笔者电脑上的结果是:
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()就很容易。笔者电脑上的结果是:
相关文章推荐
- OpenCV的几个小技巧
- C/C++ 程序调试的几个小技巧
- python 提高效率的几个小技巧
- poi的几个使用小技巧
- DataGrid的几个小技巧!
- mysql插入数据的几个小技巧
- php几个不起眼儿的小技巧
- ubuntu 11.04的几个实用小技巧
- 网页制作几个小技巧(含代码示例)
- OpenCV获取与设置像素点的值的几个方法
- 你会用QQ吗?33个QQ小技巧你知道几个?
- 几个C#编程的小技巧
- Python 的几个小技巧
- C中几个特定宏的介绍(一些调试的小技巧)
- 网络分享的几个小技巧
- PL/SQL Developer几个使用小技巧
- 几个Blog小技巧(转)
- 网页制作几个小技巧(含代码示例)
- c#开发的几个小技巧
- 几个C#编程的小技巧