• 关于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中常见函数用法总结相关推荐

  1. python中opencv中inrange用法_python-opencv中的cv2.inRange函数

    本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分 具体就调用了cv2的两个函数,一个是rgb转hsv的函数 具体用法 hsv = cv2.cvtColor(rgb_ima ...

  2. opencv中的CommandLineParser类用法

    我们在看opencv官方示例的时候,经常会看到有关CommandLineParser类的用法,那就从官方教程中来看吧 OpenCV中出现此类的主要目:方便用户在命令行使用过程中减少工作量,在这个地方定 ...

  3. OpenCV中cvAdds和cvAdd中的mask的用法探讨

    OpenCV中cvAdds和cvAdd中的mask的用法探讨 Fn : 包含 mask 参数的一些函数如下 [摘自opencv 2.3.1版本 C++] void add(InputArray src ...

  4. python中rect用法_【opencv基础】Rect类的神奇用法

    前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...

  5. OpenCV中cv2的用法

    OpenCV中cv2的用法 一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志  cv2.IMR ...

  6. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  7. OpenCV中resize函数五种插值算法的实现过程

    最新版OpenCV2.4.7中,cv::resize函数有五种插值算法:最近邻.双线性.双三次.基于像素区域关系.兰索斯插值.下面用for循环代替cv::resize函数来说明其详细的插值实现过程,其 ...

  8. OpenCV中的内存泄漏检测

    转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...

  9. OpenCV中BLOB特征提取与几何形状分类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT ...

最新文章

  1. mysql服务器端的参数有很多_但是对于大多数初学者来说_mysql优化的重要参数 key_buffer_size table_cache...
  2. java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:
  3. 再谈无边框窗体的操作
  4. CSS+js弹出居中的背景半透明div层
  5. what you should do when you are alone
  6. swift混编oc碰到的问题
  7. mysql默认值无效_MySQL开发规范
  8. 嵌入式 uboot引导kernel,kernel引导fs【转】
  9. Node.js与io.js那些事儿
  10. (图论)51NOD 1298 圆与三角形
  11. XML生成与解析(DOM、ElementTree)
  12. Java1.8新特性学习笔记
  13. ICC II setupfloorplan
  14. 【沧海拾昧】微机原理:8086/8088中断系统
  15. Android recyclerview item获焦时更新UI导致列表自动滚动到获焦处
  16. 2811: [Apio2012]Guard
  17. 免费复制/下载收费文档的方法总结
  18. SWAN测试用例af-alg/rw-cert
  19. OVP过压保护IC高耐压36V,首选钰泰ETA7008/ETA7014
  20. 杠杆炒股选择几倍比较适合?

热门文章

  1. H3C静态路由、Track与BFD联动配置举例
  2. vim批量转文件编码
  3. 從明天起做個幸福的人...
  4. 单团队敏捷开发项目管理示例
  5. Linus:Linux太烂,我要删了它,你们用Windows XP吧!
  6. Hive 高频考点讲解
  7. 写给那些想升职管理层的同学
  8. 我们公司是如何把项目中的2100个if-else彻底干掉的!
  9. 最近的裁员事件告诉我们,录音笔太重要了!送10个给大家备用!
  10. 产品需求管理经验分享