行业知识
opencv(C++)基础用法
2026-11-12 21:10:26
来源:互联网转载
文章目录
- 前言
- 一、opencv (C++)图片基本操作
- 1.1 读取图片并显示
- 1.2 颜色转换
- 1.3 图像filtering
- 1.4 形状调整
- 1.5 绘制
- 二、读取视频文件并显示
- 三、RTSP 视频流
- 四. 人脸检测
- ���结
前言
学习笔记
一、opencv (C++)图片基本操作
1.1 读取图片并显示
#include "opencv2/opencv.hpp"#include int main(int argc,char** argv){//读取图片,mat是matrix的缩写,是一个矩阵 cv::Mat image = cv::imread("./media/cat.jpg");//判断是否读取成功 if (image.empty()) { std::cout cv::Mat src = cv::imread("./media/dog.jpg"); cv::Mat gray; cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY); cv::Mat hsv; cv::cvtColor(src,hsv,cv::COLOR_BGR2HSV); cv::Mat rgb; cv::cvtColor(src,rgb,cv::COLOR_BGR2RGB); cv::imwrite("./output/1.gray.jpg",gray); cv::imwrite("./output/1.hsv.jpg",hsv); cv::imwrite("./output/1.rgb.jpg",rgb); return 0;} cv::Mat src = cv::imread("./media/dog.jpg");//模糊 cv::Mat blur;// 三个参数分别是输入图像、输出图像、卷积核大小 cv::GaussianBlur(src,blur,cv::Size(7,7),0); // 膨胀 cv::Mat dilate; cv::dilate(src,dilate,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5)));//腐蚀 cv::Mat erode; cv::erode(src,erode,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5))); cv::imwrite("./output/blur.jpg",blur); cv::imwrite("./output/dilate.jpg",dilate); cv::imwrite("./output/erode.jpg",erode); return 0;} // 读取图像 cv::Mat cat_img = cv::imread("./media/cat.jpg"); // ======== resize ======== cv::Mat cat_resize; // 三个参数分别是输入图像、输出图像、输出图像大小 cv::resize(cat_img, cat_resize, cv::Size(320, 240)); // 保存 cv::imwrite("./output/3.cat_resize.jpg", cat_resize); // ======== copy ======== cv::Mat copy; cat_img.copyTo(copy); cv::imwrite("./output/3.copy.jpg", copy); // ======== ROI裁剪 ======== cv::Rect rect(100, 100, 200, 100); // x, y, width, height cv::Mat roi = cat_img(rect); cv::imwrite("./output/3.roi.jpg", roi); // ======== 拼接 ======== cv::Mat dog_img = cv::imread("./media/dog.jpg"); cv::Mat dog_resize; cv::resize(dog_img, dog_resize, cv::Size(320, 240)); // 水平拼接,需要保证两张图片的高度(rows)一致 cv::Mat hconcat_img; cv::hconcat(cat_resize, dog_resize, hconcat_img); cv::imwrite("./output/3.hconcat.jpg", hconcat_img); // 或者使用vector方式 std::vectorcat_resize, dog_resize, cat_resize, dog_resize}; cv::Mat hconcat_img2; cv::hconcat(imgs, hconcat_img2); cv::imwrite("./output/3.hconcat2.jpg", hconcat_img2); // 数组方式 cv::Mat imgs_arr[] = {dog_resize, cat_resize, dog_resize, cat_resize}; cv::Mat hconcat_img3; cv::hconcat(imgs_arr, 4, hconcat_img3); // 4是数组长度 cv::imwrite("./output/3.hconcat3.jpg", hconcat_img3); // 垂直拼接,需要保证两张图片的宽度(cols)一致 cv::Mat vconcat_img; cv::vconcat(cat_resize, dog_resize, vconcat_img); cv::imwrite("./output/3.vconcat.jpg", vconcat_img); // ======== 翻转 ======== cv::Mat flip; // 三个参数分别是输入图像、输出图像、翻转方向 cv::flip(cat_img, flip, 1); // 1表示水平翻转,0表示垂直翻转,-1表示水平垂直翻转 cv::imwrite("./output/3.flip.jpg", flip); // ======== 旋转 ======== cv::Mat rotate; // 三个参数分别是输入图像、输出图像、旋转角度 cv::rotate(cat_img, rotate, cv::ROTATE_90_CLOCKWISE); // 顺时针旋转90度 cv::imwrite("./output/3.rotate.jpg", rotate); return 0;} // 创建一个黑色图像,参数分别是图像大小、图像类型,CV_8UC3表示8位无符号整数,3通道 cv::Mat image = cv::Mat::zeros(cv::Size(600, 600), CV_8UC3); // 绘制直线,参数分别是图像、起点、终点、颜色、线宽、线型 cv::line(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 绘制矩形,参数分别是图像、左上角、右下角、颜色、线宽、线型 cv::rectangle(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 255, 0), 2, cv::LINE_AA); // 绘制圆形,参数分别是图像、圆心、半径、颜色、线宽、线型 cv::circle(image, cv::Point(200, 150), 100, cv::Scalar(255, 0, 0), 2, cv::LINE_AA); // 实心 cv::circle(image, cv::Point(200, 150), 50, cv::Scalar(255, 0, 0), -1, cv::LINE_AA); // // ================== 多边形 ================== // cv::Point points[2][4]; // 定义两个多边形的顶点数组 // // 第一个多边形的顶点 // points[0][0] = cv::Point(100, 115); // points[0][1] = cv::Point(255, 135); // points[0][2] = cv::Point(140, 365); // points[0][3] = cv::Point(100, 300); // // 第二个多边形的顶点 // points[1][0] = cv::Point(300, 315); // points[1][1] = cv::Point(555, 335); // points[1][2] = cv::Point(340, 565); // points[1][3] = cv::Point(300, 500); // // ppt[] 要同时添加两个多边形顶点数组的地址) // const cv::Point *pts_v[] = {points[0], points[1]}; // // npts_v[]要定义每个多边形的顶点数 // int npts_v[] = {4, 4}; // // 绘制多边形,参数分别是图像、顶点数组、顶点数、曲线数量、是否闭合、颜色、线宽、线型 // cv::polylines(image, pts_v, npts_v, 2, true, cv::Scalar(255, 0, 255), 2, 8, 0); // ================== 使用vector绘制多边形 ================== std::vector points_v.push_back(cv::Point(rand() % 600, rand() % 600)); } // 绘制多边形,参数分别是图像、顶点容器、是否闭合、颜色、线宽、线型 cv::polylines(image, points_v, true, cv::Scalar(255, 0, 0), 2, 8, 0); // ================== 绘制文字 ================== // 参数分别是图像、文字、文字位置、字体、字体大小、颜色、线宽、线型 cv::putText(image, "Hello World!", cv::Point(400, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 255, 255), 2, 8, 0); // 保存 cv::imwrite("./output/4.drawing.jpg", image); return 0;} // 解析命令行参数 gflags::ParseCommandLineFlags(&argc, &argv, true); // 读取视频:创建了一个VideoCapture对象,参数为视频路径 cv::VideoCapture capture(FLAGS_video); // 判断视频是否读取成功,返回true表示成功 if (!capture.isOpened()) { std::cout // 读取视频帧,使用 运算符或者read()函数,他的参数是返回的帧 capture.read(frame); // capture frame; // 判断是否读取成功 if (frame.empty()) { std::cout std::cout // 解析命令行参数 gflags::ParseCommandLineFlags(&argc, &argv, true); // 读取视频:创建了一个VideoCapture对象,参数为摄像头编号 cv::VideoCapture capture(FLAGS_camera); // 设置指定摄像头的分辨率 int width = 640; int height = 480; // 设置摄像头宽度和高度 capture.set(cv::CAP_PROP_FRAME_WIDTH, width); capture.set(cv::CAP_PROP_FRAME_HEIGHT, height); // 判断视频是否读取成功,返回true表示成功 if (!capture.isOpened()) { std::cout // 读取视频帧,使用 运算符或者read()函数,他的参数是返回的帧 capture.read(frame); // capture frame; // flip cv::flip(frame, frame, 1); // 显示视频帧 cv::imshow("opencv demo", frame); // 写入视频 writer.write(frame); // 等待按键,延迟30ms,否则视频播放太快 int k = cv::waitKey(30); // 按下ESC键退出 if (k == 27) { std::cout // Ubuntu安装ffmpeg:sudo apt-get install ffmpeg // rtsp地址变量 // 一般main 主码流,sub 子码流 std::string rtsp1 = "rtsp://admin:SEGJKL@192.168.1.185:554/h264/ch1/sub/av_stream"; std::string rtsp2 = rtsp1; std::string rtsp3 = rtsp1; std::string rtsp4 = rtsp1; // std::string rtsp1 = "rtsp://localhost:8554/live1.sdp"; // std::string rtsp2 = "rtsp://localhost:8554/live2.sdp"; // std::string rtsp3 = "rtsp://localhost:8554/live3.sdp"; // std::string rtsp4 = "rtsp://localhost:8554/live4.sdp"; // CAP_FFMPEG:使用ffmpeg解码 cv::VideoCapture stream1 = cv::VideoCapture(rtsp1, cv::CAP_FFMPEG); cv::VideoCapture stream2 = cv::VideoCapture(rtsp2, cv::CAP_FFMPEG); cv::VideoCapture stream3 = cv::VideoCapture(rtsp3, cv::CAP_FFMPEG); cv::VideoCapture stream4 = cv::VideoCapture(rtsp4, cv::CAP_FFMPEG); if (!stream1.isOpened() || !stream2.isOpened() || !stream3.isOpened() || !stream4.isOpened()) { std::cout if (!stream1.read(frame1) || !stream2.read(frame2) || !stream3.read(frame3) || !stream4.read(frame4)) { std::cout break; } } return 0;} // 获取图像的宽高 int frameHeight = frame.rows; int frameWidth = frame.cols; // 预处理,resize + swapRB + mean + scale cv::Mat inputBlob = cv::dnn::blobFromImage(frame, 1.0, cv::Size(300, 300), cv::Scalar(104.0, 177.0, 123.0), false, false); // 推理 net.setInput(inputBlob, "data"); cv::Mat detection = net.forward("detection_out"); // 获取结果 cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr // 置信度 float confidence = detectionMat.at // 两点坐标 int l = static_cast // 读取图片 cv::Mat img = cv::imread("./media/test_face.jpg"); // 推理 detectDrawRect(img); // 显示 cv::imshow("image test", img); // 保存 cv::imwrite("./output/test_face_result.jpg", img); cv::waitKey(0);}// 实时视频流检测void videoTest(){ // =========== 摄像头 =========== // 先读取camera或文件视频流并显示 // cv::VideoCapture cap(2); // // 设置指定摄像头的分辨率 // int width = 640; // int height = 480; // // 设置摄像头宽度和高度 // cap.set(cv::CAP_PROP_FRAME_WIDTH, width); // cap.set(cv::CAP_PROP_FRAME_HEIGHT, height); // =========== 文件 =========== // 先读取camera或文件视频流并显示 cv::VideoCapture cap("./media/video.mp4"); // 获取视频流的宽高 int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); // 构造写入器 // 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小 cv::VideoWriter writer("./output/record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 25, cv::Size(width, height)); if (!cap.isOpened()) { std::cout if (!cap.read(frame)) { std::cout // std::cout // 图片测试 // imageTest(); // 视频测试 videoTest(); return 0;}
上一篇:申请本地服务器怎么填信息?
下一篇:ec服务器个性商店怎么开?