OpenCV练习第一弹

64 阅读1分钟

本文已参与「新人创作礼活动」,一起开启掘金创作之路。

专注于计算机视觉,用心灵的窗口照亮世界。

本次练习的目的是找出交界处轮廓的左右两点,并连成直线。涉及到以下三个知识点:

1.opencv像素操作的常用方法

2.opencv图像的深浅拷贝

3.opencv point的用法

image.png


一、opencv像素操作的常用方法

1.at()函数

uchar value = grayim.at<uchar>(i, j);   //读出第i行第j列像素值
grayim.at<uchar>(i, j) = 128;          //将第i行第j列像素值设置为128

2.使用迭代器

MatIterator_<uchar> grayit, grayend;
for(grayit = grayim.begin<uchar>(), grayend = grayim.end<uchar>(); grayit != grayend; ++grayit)
		  *grayit = rand()%255;

3.通过数据指针

for(int i = 0; i < grayim.rows; ++i)
{
	uchar *p = grayim.ptr<uchar>(i);
	for(int j = 0; j < grayim.cols; ++j)
		p[j] = (i + j) % 255;
}

二、opencv图像的深浅拷贝

先聊聊cv::Mat。cv::Mat是用于保存图像以及其他矩阵数据结构的数据结构,当cv::Mat实例化后,分配内存;当对象离开作用域后,分配的内存自动释放。cv::Mat实现了引用计数以及浅拷贝。引用计数的作用是只有当所有内存数据的对象都被析构后,内存才会释放。

1.浅拷贝

当图像间之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。

![](https://img-blog.csdnimg.cn/img_convert/73abc5a27035d89d76fde864b13681f0.png)

2.深拷贝

指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同的地方。OpenCV中可以通过下面两种方式实现深拷贝。copyTo和clone的区别

  • img.copyTo(img1)
  • img1= img.clone()

image.png

三、opencv point的用法

Point类是一个包含两个整型数据成员x和y以及一些简单成员方法的类类型,和它有关的好几个Point点类的变种如下所示:

//【1】Point2f----二维单精度浮点型点类  
//【2】Point2d----二维双精度浮点型点类  
//【3】Point3i----三维整形点类  

参考文献:

1.【于仕琪 OpenCV入门教程】

2.【OpenCV中图像的浅拷贝与深拷贝

3.【OpenCV中的基本数据类型——Point,Size,Rect,Scalar,Vec3b