本文已参与「新人创作礼活动」,一起开启掘金创作之路。
专注于计算机视觉,用心灵的窗口照亮世界。
本次练习的目的是找出交界处轮廓的左右两点,并连成直线。涉及到以下三个知识点:
1.opencv像素操作的常用方法
2.opencv图像的深浅拷贝
3.opencv point的用法
一、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.浅拷贝
当图像间之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。
2.深拷贝
指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同的地方。OpenCV中可以通过下面两种方式实现深拷贝。copyTo和clone的区别。
- img.copyTo(img1)
- img1= img.clone()
三、opencv point的用法
Point类是一个包含两个整型数据成员x和y以及一些简单成员方法的类类型,和它有关的好几个Point点类的变种如下所示:
//【1】Point2f----二维单精度浮点型点类
//【2】Point2d----二维双精度浮点型点类
//【3】Point3i----三维整形点类
参考文献:
1.【于仕琪 OpenCV入门教程】