关于OpenCV中常见函数用法总结
- 关于OpenCV中常见函数用法总结
- 一 一般Mat的赋值操作
- 二 求Mat中的最大值以及最小值
- 三 randn()函数给图像添加高斯噪声
- 四 mean()函数的用法
- 五 系统计时器
- 六 矩阵之间的四则运算:gemm()函数
- 七 利用OpenCV如何实现在图像指定位置处生成填充的圆形图案
- 八 将相机中的Image类型转化为Mat类型
关于OpenCV中常见函数用法总结
一 一般Mat的赋值操作
对于一般的Mat如何进行赋值,这里,只是因为经常会忘记,故而单独记录下来:
示例代码:
Mat mask=(Mat_<char>(3,3)<<1,1,1,1,0,1,1,1,1,1);`
二 求Mat中的最大值以及最小值
示例代码:
#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
void main()
{cv::Mat img = (cv::Mat_<char>(3,3)<<1,2,3,4,8,6,5,19,30);double MaxValue, MinValue;cv::minMaxLoc(img, &MinValue,&MaxValue);cout << MinValue << " " << MaxValue << " " << endl;}
通过以上代码,可以找到Mat中的最大值以及最小值。
三 randn()函数给图像添加高斯噪声
int length=600;int width=600;Mat Imgnoise = Mat::zeros(length, width, CV_8UC1);int meanShiftValue = 50;randn(Imgnoise, meanShiftValue, sigma);Imgnoise = Imgnoise + img - meanShiftValue;
说明:
此处的meanShiftValue代表的是:噪声均值。sigma:代表标准差。由于 CV_8UC1的像素值范围为(0,255),所以此处像素值不能取负数,故而 meanShiftValue取的值必须要大于0.
四 mean()函数的用法
之前一直想求一个矩阵中的所用值的均值,可是都没能成功使用mean()来取出最终结果,后来无意中使用Google搜索,成功解决了难题。
示例代码
Mat MyMat;
cv::Scalar meanValue=cv::mean(MyMat);
float MyMeanValue = meanValue.val[0];
cout<<"MyMat中的所有元素的平均值为:"<<MyMeanValue<<endl;
注:对于容器,此方法也同样适用。
五 系统计时器
代码:
double t = (double)getTickCount();////开始计时//do something......t = ((double)getTickCount() - t) / getTickFrequency();//放在函数结尾,计算时间,单位为:秒cout << "时间== " << t << endl;//输出时间
注:
//getTickcount函数:它返回从操作系统启动到当前所经的计时周期数
//getTickFrequency函数:返回每秒的计时周期数
六 矩阵之间的四则运算:gemm()函数
OpenCV 中计算矩阵之间的加减乘除:gemm()
调用方法:
//Tra = C2_mat - Rot*C1_mat
gemm(Rot,C1_mat,-1,C2_mat,1,Tra);
七 利用OpenCV如何实现在图像指定位置处生成填充的圆形图案
例如:如果要生成如下的图案:
代码:
int main()
{int radius = 7.5;int width = 16;Mat circle = CoreAlgorithm::**circleImg**(radius, width);Mat image = Mat(1500, 1500, CV_8UC1, Scalar(255));Point2i offset = Point2i(0,0);//在图像空间内平移整个特征的平移量vector<Point2i> PointVec;PointVec.push_back(Point2i(100, 150));//1号PointVec.push_back(Point2i(600, 100));//2号PointVec.push_back(Point2i(600, 150));//4号PointVec.push_back(Point2i(50, 150));//5号PointVec.push_back(Point2i(150, 150));//6号PointVec.push_back(Point2i(100, 100));//7号PointVec.push_back(Point2i(100, 200));//8号PointVec.push_back(Point2i(550, 100));//9号PointVec.push_back(Point2i(650, 100));//10号for (size_t i = 0; i < PointVec.size(); i++){if (!CoreAlgorithm::*copyCircleToImg*(circle, offset, PointVec[i], image))return 1;}cv::namedWindow("result", 1);cv::imshow("result", image);waitKey();
}
至于其中用到的两个主要函数为:
主要调用的两个函数:
//radius 圆半径,(单位像素);width,生成模板图像大小,正方形
Mat CoreAlgorithm::circleImg(int radius, int width)
{Mat img = Mat(width, width, CV_8UC1, Scalar(255));for (int i = 0; i < img.rows; i++){for (int j = 0; j<img.cols; j++){if (sqrt(pow(i - (width - 1) / 2.0, 2) + pow(j - (width - 1) / 2.0, 2))>radius)continue;elseimg.at<uchar>(i, j) = (uchar)0;}}return img;
}
//////////实现将圆重复绘制在指定位置
bool copyCircleToImg(const Mat circleImg, Point2i offset, Point2i location, Mat &writeImg)
{location.x += offset.x;location.y += offset.y;if (location.x - (circleImg.cols - 1) / 2.0<0 || location.y - (circleImg.rows - 1) / 2.0<0 ||location.x + (circleImg.cols - 1) / 2.0>writeImg.cols || location.y + (circleImg.rows - 1) / 2.0>writeImg.rows)return false;Point2i circleImgstart = Point2i(location.x - (circleImg.cols - 1) / 2, location.y - (circleImg.rows - 1)/2);for (int i = 0; i < circleImg.rows; i++){for (int j = 0; j < circleImg.cols; j++){writeImg.at<uchar>(circleImgstart.y + i, circleImgstart.x + j) = circleImg.at<uchar>(i, j);}}return true;
}
主要的实现思想是先生成一个圆形模板,而后将圆形模板在指定位置处不断复制即可。
八 将相机中的Image类型转化为Mat类型
已知相机中Image.h中的相关属性定义为:
/*** Construct an Image object with the specified arguments.** @param rows Rows in the image.* @param cols Columns in the image.* @param format Pixel format.* @param bayerFormat Format of the Bayer tiled raw image.*/Image(unsigned int rows,unsigned int cols,PixelFormat format,BayerTileFormat bayerFormat = NONE );/*** Get the number of rows in the image.** @return The number of rows.*/virtual unsigned int GetRows() const;/*** Get the number of columns in the image.** @return The number of columns.*/virtual unsigned int GetCols() const;/*** Get a pointer to the data associated with the image. This function* is considered unsafe. The pointer returned could be invalidated if* the buffer is resized or released. The pointer may also be* invalidated if the Image object is passed to* Camera::RetrieveBuffer(). It is recommended that a Image::DeepCopy()* be performed if a seperate copy of the Image data is required* for further processing.** @return A pointer to the image data.*/virtual unsigned char* GetData();
而Mat属性为:
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
因而由image转化为mat的语句如下:
Image img;cv::Mat image = cv::Mat(img.GetRows(), img.GetCols(), CV_8UC1, (void*)img.GetData());
个人公众号:
关于OpenCV中常见函数用法总结相关推荐
- python中opencv中inrange用法_python-opencv中的cv2.inRange函数
本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分 具体就调用了cv2的两个函数,一个是rgb转hsv的函数 具体用法 hsv = cv2.cvtColor(rgb_ima ...
- opencv中的CommandLineParser类用法
我们在看opencv官方示例的时候,经常会看到有关CommandLineParser类的用法,那就从官方教程中来看吧 OpenCV中出现此类的主要目:方便用户在命令行使用过程中减少工作量,在这个地方定 ...
- OpenCV中cvAdds和cvAdd中的mask的用法探讨
OpenCV中cvAdds和cvAdd中的mask的用法探讨 Fn : 包含 mask 参数的一些函数如下 [摘自opencv 2.3.1版本 C++] void add(InputArray src ...
- python中rect用法_【opencv基础】Rect类的神奇用法
前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...
- OpenCV中cv2的用法
OpenCV中cv2的用法 一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志 cv2.IMR ...
- OpenCV学习笔记(12)——OpenCV中的轮廓
什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...
- OpenCV中resize函数五种插值算法的实现过程
最新版OpenCV2.4.7中,cv::resize函数有五种插值算法:最近邻.双线性.双三次.基于像素区域关系.兰索斯插值.下面用for循环代替cv::resize函数来说明其详细的插值实现过程,其 ...
- OpenCV中的内存泄漏检测
转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...
- OpenCV中BLOB特征提取与几何形状分类
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT ...
最新文章
- mysql服务器端的参数有很多_但是对于大多数初学者来说_mysql优化的重要参数 key_buffer_size table_cache...
- java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:
- 再谈无边框窗体的操作
- CSS+js弹出居中的背景半透明div层
- what you should do when you are alone
- swift混编oc碰到的问题
- mysql默认值无效_MySQL开发规范
- 嵌入式 uboot引导kernel,kernel引导fs【转】
- Node.js与io.js那些事儿
- (图论)51NOD 1298 圆与三角形
- XML生成与解析(DOM、ElementTree)
- Java1.8新特性学习笔记
- ICC II setupfloorplan
- 【沧海拾昧】微机原理:8086/8088中断系统
- Android recyclerview item获焦时更新UI导致列表自动滚动到获焦处
- 2811: [Apio2012]Guard
- 免费复制/下载收费文档的方法总结
- SWAN测试用例af-alg/rw-cert
- OVP过压保护IC高耐压36V,首选钰泰ETA7008/ETA7014
- 杠杆炒股选择几倍比较适合?