OpenCV(C++) 基础(一)-- 读/写/合成图像

1.头文件&命名空间

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>        // 核心组件
#include<opencv2/highgui/highgui.hpp>  // GUI
#include<opencv2/imgproc/imgproc.hpp>  // 图像处理
using namespace cv;
using namespace std;

2.图片读取/显示/保存

// 读取图片,读取后格式为Mat
Mat src = imread(filepath); // string格式
// 显示图片
imshow(window_name, src); // (string, Mat)
// waitKey(0); // 持续显示
while(1){
	// 直到用户按Esc退出
	if(waitKey(30) == 27) break; // Esc的ASCII码编号27
}
// 图片保存
imwrite(filepath, src); // (string, Mat)

3.命名窗口(显示图片)

// namedWindow(winname, flags=WINDOW_AUTOSIZE );
// WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
// WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
namedwindow("srcimg"); // 命名必须和imshow中的命名一致
imshow("srcimg", src); 

4.读取视频文件

//  Capture Video
String filename = "raw.avi"; //文件名
VideoCapture capture(filename);
while (1) {
	Mat frame;
	capture >> frame; // read the current frame
	if (frame.empty()) break;
	imshow("Read Video", frame);
	waitKey(30); // delay 30ms,每一帧30ms
}

5.打开摄像头

// open the camera, edge detection
	VideoCapture capture(0); // 打开摄像头
	Mat edges;
	while (1) {
		Mat frame;
		capture >> frame; // 读取当前帧
		cvtColor(frame, edges, COLOR_BGR2GRAY); // 变换为灰度图
		blur(edges, edges, Size(7, 7)); // 平滑滤波
		Canny(edges, edges, 0, 30, 3);  // Canny边缘检测
		imshow("Read Video", edges); //显示图片
		if(waitKey(30) >= 0) break; // delay 30 ms
	}

6.imread第二、三个参数

Mat pic = imread("001.jpg", 2 | 4); // read lossless img, flag<0: 读取无损图像
Mat pic1 = imread("001.jpg", 0); // read gray img, flag=0: 读取灰度图
Mat pic2 = imread("001.jpg", 1); // read 3 channels img, flag>0: 读取三通道图像(RGB)
// 第三个参数:jpg(0-100, 图片质量, default:95)
//            png(0 - 9), 越高尺寸越小, 默认3
//            pgm/pbm(0 或 1)二进制格式标尺,默认1

7.addWeighted函数:合成图像

// src1,图一, 常常填一个Mat。
// alpha,图一权重
// src2,图二,需要和第一个数组拥有相同的通道数
// beta,图二权重
// dst,输出图像
// gamma,一个加到权重总和上的标量值。
// dtype,输出阵列的可选深度,有默认值-1
void addWeighted(src1, alpha, src2, beta, gamma, dst, dtype=-1)

8.合成图像实例

Mat src = imread("002.jpg");
Mat logo = imread("004.jpg");
Mat ROI = src(Rect(0, 0, logo.rows, logo.cols)); //Rect表示矩形区域:左上角(0,0),宽高(logo.rows, logo.cols)
addWeighted(ROI, 0.8, logo, 1, 0., ROI); // ROI: region of interest
imwrite("H:/CV/pic/005.jpg", src); //保存

猜你喜欢

转载自blog.csdn.net/francislucien2017/article/details/80962830