OpenCV的几个小技巧

php中文网
发布: 2016-06-07 15:16:58
原创
1568人浏览过

申明:以下的小技巧,均为 OpenCV2.4.2 下验证过的,但并不保证其它版本依然奏效 (1)利用数组来构建 cv::Mat 示例代码如下所示: void ArrayToMat(){double m[3][3];for (int i=0; i3; i++){for (int j=0; j3; j++){m[i][j] = i+j;coutm[i][j] ;}coutendl;

申明:以下的小技巧,均为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;
	}
}
登录后复制

不出意外的话,执行结果应该如下所示:

OpenCV的几个小技巧

(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);
}
登录后复制

笔者任意加载了电脑上一副图片,结果如下所示:

OpenCV的几个小技巧

提醒,这里的格式转换并不申请新的内存,而仅仅是改变数据结构而已

(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);
}
登录后复制

笔者任意加载一张图片,上述代码的执行结果为:

OpenCV的几个小技巧

(4)访问二维数据(cv::Mat)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问

45°C商城系统
45°C商城系统

系统介绍 45°C 商城系统,以 Thinkphp5.0 + Uniapp + Layui2.9 + Vue 为技术基石,精心打造出的全新 MINI 商城应用。其功能覆盖全面,无论是 PC 商城、H5 商城,还是公众号商城、微信小程序以及抖音小程序的制作都能完美胜任。采用标准系统结合插件模式开发,用户能够极为便捷地定制专属的个性模块。整个系统,从程序设计到 UI 呈现,都秉持着一贯的小而美理念。程

45°C商城系统 0
查看详情 45°C商城系统

示例代码:

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;
}
登录后复制

上面的代码执行结果为:

OpenCV的几个小技巧

(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;
}
登录后复制

运行结果:

OpenCV的几个小技巧

(6) satureat_cast : openCV中用于数据“饱和”判断

示例:

void Saturate_castTest()
{
	int r = 300;
	uchar t = saturate_cast<uchar>(r);
	cout<<int(t)<<endl;
}
登录后复制

结果:

OpenCV的几个小技巧

(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的几个小技巧


最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号