opencv使用中的一点经验记

1、OpenCv中三通道颜色为BRG,而非RGB,其原因大概是BRG在当时的年代是最流行的(具体见:https://www.learnopencv.com/why-does-opencv-use-bgr-color-format/)

2、常见的二维图像坐标体系中零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。在OpenCv中Rect(cv::Rect cvRect(int x, int y, int width, int height)),Point(CvPoint cvPoint(int x, int y ))都符合这类坐标系,但是使用image.at<>(i,j)时,i相当于y轴,j相当于x轴。(参考:https://blog.csdn.net/hyqsong/article/details/49754927)

3、Mat进行拷贝构造、赋值运算符只是创建了头部分,其数据部分仍是共享的(参考:https://blog.csdn.net/corcplusplusorjava/article/details/24641011)。为了可以修改数据部分,可以选择使用clone()或者copyTo。二者之间的区别(https://stackoverflow.com/questions/15672600/whats-the-difference-between-matclone-and-matcopyto)

clone()的实现:

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}

可以看出,clone()在拷贝时给目标mat分配了新的地址。

4、contourArea计算轮廓面积,简单来说其计算面积是每两个轮廓点向量的叉乘(具体:https://blog.csdn.net/m0_37914500/article/details/78615284),所以计算处理和直接数像素个数总数并不是一样的。

5、cvBox2D和RotatedRect中的角度(具体:https://www.cnblogs.com/panxiaochun/p/5478555.html 作者非常用心)

主要有几点:(1) 坐标系是原点在左上角,x轴水平向右,y轴竖直向下;(2) width是x轴逆时钟旋转时碰到的第一条边;(3) 逆时钟旋转角度为负;(4) 返回的角度单位为度,而不是弧度。

猜你喜欢

转载自www.cnblogs.com/liuxin0430/p/9170339.html