本文章用于记录自己使用open CV过程中的要点,便于遗忘时查看。
首先使用
using namespace std;
using namespace cv;
避免每次都需要敲 ::cv及::std;
图像的读写显示存取
图像定义:
Mat image;
图像读取:
imread(const String & filename,int flags = IMREAD_COLOR);
支持格式有:
- Windows bitmaps - *.bmp, *.dib (always supported)
- JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
- JPEG 2000 files - *.jp2 (see the Notes section)
- Portable Network Graphics - *.png (see the Notes section)
- WebP - *.webp (see the Notes section)
- Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
- Sun rasters - *.sr, *.ras (always supported)
- TIFF files - *.tiff, *.tif (see the Notes section)
- OpenEXR Image files - *.exr (see the Notes section)
- Radiance HDR - *.hdr, *.pic (always supported)
- Raster and Vector geospatial data supported by Gdal (see the Notes section)
读取方式有:
IMREAD_UNCHANGED 按照图片原格式读入.
IMREAD_GRAYSCALE 将图片转为单通道灰色图.
IMREAD_COLOR 将图片转为BGR3通道 .
IMREAD_ANYDEPTH 如果图片是16-bit/32-bit ,则保持不变,其他的都转为8-bit.
IMREAD_ANYCOLOR 图像以任何可能的颜色格式读取.
IMREAD_LOAD_GDAL 使用GDAL载入图像.
IMREAD_REDUCED_GRAYSCALE_2 将图片转为单通道灰色图,同时将图片尺寸裁剪到 1/2.
IMREAD_REDUCED_COLOR_2 将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/2.
IMREAD_REDUCED_GRAYSCALE_4 将图片转为单通道灰色图,同时将图片尺寸裁剪到 1/4.
IMREAD_REDUCED_COLOR_4 将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/4.
IMREAD_REDUCED_GRAYSCALE_8 将图片转为单通道灰色图,同时将图片尺寸裁剪到 1/8.
IMREAD_REDUCED_COLOR_8 将图片转为BGR 3通道,同时将图片尺寸裁剪到 1/8.
IMREAD_IGNORE_ORIENTATION 如果设置,不旋转图像根据EXIF的定位标志
显示图像:
imshow(const String & winname, InputArray mat);
显示窗口:
namedWindow(const String & winname,int flags = WINDOW_AUTOSIZE)
- WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小
- WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
- WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
waitKey(int delay = 0)
这个函数用来等待,读取和处理事件。当我们没有输入,只需要窗口停留,就可以将参数设为0。
图像保存:
imwrite(const String & filename InputArray img, const vector< int > & params = vector< int >())
图像缩放、旋转、截取、叠加
缩放:
resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
InputArray src -原图像 OutputArray dst -输出图像
Size dsize -目标图像的大小
double fx=0 -在x轴上的缩放比例
double fy=0 -在y轴上的缩放比例
int interpolation -插值方式,有以下四种方式
INTER_NN -最近邻插值
INTER_LINEAR -双线性插值 (缺省使用)
INTER_AREA -使用象素关系重采样,当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。
INTER_CUBIC -立方插值。
dsize与(fx,fy)不能同时为0
旋转:
Mat rotMat;Point rotCenter = Point(x,y); // x,y为旋转中心坐标
rotMat = getRotationMatrix2D(Point2f center, double angle, double scale);//获取旋转矩阵,angle为逆时针;scale为缩放比例.
warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar());
根据getAffineTransform或getRotationMatrix2D得到的变换矩阵,计算变换后的图像。
src为输入图像
dst为变换后图像,类型与src一致。
M为变换矩阵,需要通过其它函数获得,当然也可以手动输入。dsize为输出图像的大小
flags,插值算法,详细如下:
INTER_NEAREST = 0, //最近邻插值
INTER_LINEAR = 1, //双线性插值
INTER_CUBIC = 2, //双三次插值
INTER_AREA = 3, //区域插值,使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。
INTER_LANCZOS4 = 4, //Lanczos插值(超过8×8像素邻域的Lanczos插值)
INTER_MAX = 7,
WARP_FILL_OUTLIERS = 8, //填充所有输出图像的象素
WARP_INVERSE_MAP = 16 //逆变换
borderMode为边界处理方式:
BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
BORDER_TRANSPARENT = 5, //!< `uvwxyz|absdefgh|ijklmno`
BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_ISOLATED = 16 //!< do not look outside of ROI
截取:
Mat imageROI;
imageROI = image(Rect(100, 100, 400, 400));
或者用:
imageROI = image(Range(100, 400),Range(100, 400));
叠加:
addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
公式为: dst = src1*alpha + src2*beta + gamma;
注意:图像大小必须一致。如果不一致,可以用ROI方法:
首先在原图中取出需要添加的位置图像:
imageROI = image(Rect(200, 200, image_to_add.cols, image_to_add.rows));
然后将需要添加的图像融合:
addWeighted(image_to_add, 0.8, imageROI, 0.1, 0., imageROI);
这样需要叠加的图像 image_to_add 就添加到imageROI区域了。
直方图:
参考:点击打开链接
sobel算子计算梯度:
参考:点击打开链接
直方图均衡:
equalizeHist(InputArray src,
OutputArray dst
);
中值滤波:
blur(InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT
);
高斯滤波:
GaussianBlur(InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
);
双边滤波:
bilateralFilter(InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
);
方框滤波:
boxFilter(InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT
);
颜色空间转换
参考:点击打开链接
边缘、轮廓
用Sobel计算边缘
假定输入图像矩阵为 I,卷积核大小为 3x3,则水平一阶导数 Gx 和垂直一阶导数 Gy 分别为:
Gx=⎡⎣⎢−1−2−1000121⎤⎦⎥∗IGy