OpenCV的几个小技巧
来源:互联网 发布:会sql好找工作吗 编辑:程序博客网 时间:2024/05/16 17:43
申明:以下的小技巧,均为OpenCV2.4.2下验证过的,但并不保证其它版本依然奏效
(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()就很容易。笔者电脑上的结果是:
- OpenCV的几个小技巧
- OpenCV的几个小技巧
- DataGrid的几个小技巧!
- DataGrid的几个小技巧
- DataGrid的几个小技巧!
- DataGrid的几个小技巧
- DataGrid的几个小技巧
- DataGrid的几个小技巧
- DataGrid的几个小技巧!
- DataGrid的几个小技巧
- DataGrid的几个小技巧
- dede的几个小技巧
- GridView的几个小技巧
- 系统管理的几个小技巧
- FckEditor的几个小技巧
- javascript的几个小技巧
- Eclipse的几个小技巧
- FckEditor的几个小技巧
- C#高仿腾讯QQ截图程序
- 命令行收邮件
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- Find Out If a Variable Is Set or Not(转载)
- form 中Enctype=multipart/form-data 的作用
- OpenCV的几个小技巧
- 网络游戏解密
- 手机、火车飞机时刻、Email 电子邮件地址验证等 WEB 服务
- JavaScript数组常用操作
- C# 通讯中ReceiveTimeout和SendTimeout的作用
- C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
- 一个合格的程序员应该读过哪些书 .
- 【程序12】模拟掷骰子游戏
- webservice