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)、image[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) 返回的角度单位为度,而不是弧度。
6、下采样函数pyrDown中向下是图像尺寸减半,当时图像金字塔里,向上是图像减小(https://blog.csdn.net/qq_20823641/article/details/52221442)
7、pyrDown/pyrUp和resize的区别(https://stackoverflow.com/questions/19074184/whats-the-difference-between-resize-and-prydown-pryup-in-opencv):pyrDown和pyrUp是为了构建图像金字塔的,上/下采样类似于最邻近插值;resize是用于缩放图像的,有多种插值方式可以选择。