您现在的位置是:主页 > news > 西安微网站建设/湖南百度推广公司

西安微网站建设/湖南百度推广公司

admin2025/5/8 1:18:17news

简介西安微网站建设,湖南百度推广公司,长沙网站技术专家,软件大全安卓版下载申明&#xff1a;以下的小技巧&#xff0c;均为OpenCV2.4.2下验证过的&#xff0c;但并不保证其它版本依然奏效&#xff08;1&#xff09;利用数组来构建cv::Mat示例代码如下所示&#xff1a; void ArrayToMat() { double m[3][3]; for (int i0; i<3; i) { for (int j…

西安微网站建设,湖南百度推广公司,长沙网站技术专家,软件大全安卓版下载申明&#xff1a;以下的小技巧&#xff0c;均为OpenCV2.4.2下验证过的&#xff0c;但并不保证其它版本依然奏效&#xff08;1&#xff09;利用数组来构建cv::Mat示例代码如下所示&#xff1a; void ArrayToMat() { double m[3][3]; for (int i0; i<3; i) { for (int j…

申明:以下的小技巧,均为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()就很容易。笔者电脑上的结果是: