OpenCV的几个小技巧(一)

2014-11-24 08:48:28 · 作者: · 浏览: 0
申明:以下的小技巧,均为OpenCV2.4.2下验证过的,但并不保证其它版本依然奏效
(1)利用数组来构建cv::Mat
示例代码如下所示:
[cpp]
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<
}
cout<
}
cout<<"****************************************"<
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(i,j);
cout<
}
cout<
}
}
不出意外的话,执行结果应该如下所示:
(2) IplImage*跟cv::Mat之间的互相转换
示例代码:
[cpp]
void IplImageToMat()
{
IplImage* pImg = cvLoadImage("c:/test.jpg");
if (!pImg)
{
cout<<"pImg load error"<
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
示例代码:
[cpp]
void MatToIplImage()
{
Mat m = imread("c:/test.jpg");
if (m.empty())
{
cout<<"mat load error"<
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)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问
示例代码:
[cpp]
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<
}
cout<
}
cout<<"****************************************"<
Mat M = Mat(3, 3, CV_64F, m);
double sum = 0;
int rows = M.rows;
int cols = M.cols;
for (int i=0; i
{
const double* Mi = M.ptr(i);
for (int j=0; j
{
sum += Mi[j];
}
}
cout<<"sum: "<
}
上面的代码执行结果为:
(5)cv::Mat支持STL中的迭代器功能
示例代码:
[cpp]
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<
}
cout<
}
cout<<"****************************************"<
Mat M = Mat(3, 3, CV_64F, m);
double sum = 0;
int rows = M.rows;
int cols = M.cols;
for (int i=0; i
{
const double* Mi = M.ptr(i);
for (int j=0; j
{
sum += Mi[j];
}
}
cout<<"sum: "<
sum = 0;
MatConstIterator_ it = M.begin();
MatConstIterator_ itEnd = M.end();
for (;it!=itEnd; it++)
{
sum += *it;
}
cout<<"sum: "<
}
运行结果:
(6) satureat_cast : openCV中用于数据“饱和”判断
示例:
[cpp]
void Saturate_castTest()
{
int r = 300;
uchar t = saturate_cast(r);
cout<
}
结果:
(7)获取函数执行时间
getTickCount()和getTickFrequency()结合起来可以用来计算函数执行时间,尤其是很小的代码片段的执行时间
举例:
[cpp]
void GetFuncTime()
{ www.2cto.com
double exec_time = (double)getTickCount();
for (int i=0; i<10; i++)
{
;
}
exec_time = ((double)getTickCount() - exec_time)*1000./getTickFrequency();
cout<
}
上面