OpenCV(C++版本)基础相关:图像的旋转视频文件摄像头使用视频处理与保存图像的直方图二维直方图

Posted Hankerchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV(C++版本)基础相关:图像的旋转视频文件摄像头使用视频处理与保存图像的直方图二维直方图相关的知识,希望对你有一定的参考价值。

文章目录


知识来源:哔哩哔哩。以下内容仅为学习笔记,不做其他用途。

二十一、图像的旋转

知识点:

  • M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);//第一个参数表示center:旋转中心坐标,是一个元组参数(col, row);第二个参数表示angle:旋转角度,旋转方向,负号为逆时针,正号为顺时针;第三个参数表示scale:旋转后图像相比原来的缩放比例,1为等比例缩放。
  • warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(0, 0, 255));//image表示输入图像;dst为输出图像;M表示矩阵变换关系,通常是平移或者旋转;Size(nw, nh)输出图像的尺寸;INTER_LINEAR表示线性插值;0表示边界像素模式;Scalar(0, 0, 255)表示颜色。

21.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象

public:
	void rotate_demo(Mat &image);
;

21.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>

void QuickDemo::rotate_demo(Mat &image)

	Mat dst, M;
	int h = image.rows;//定义图片的高度
	int w = image.cols;//定义图片的宽度
	M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);//中心的,角度,缩放比例
	double cos = abs(M.at<double>(0, 0));
	double sin = abs(M.at<double>(0, 1));
	int nw = cos * w + sin * h;
	int nh = sin * w + cos * h;
	M.at<double>(0, 2) += (nw / 2 - w / 2);
	M.at<double>(1, 2) += (nh / 2 - h / 2);
	//输入图像,输出图像,变换矩阵,输出尺寸;插值符号,边界像素模式,颜色
	warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(0, 0, 255));
	
	imshow("旋转演示", dst);





21.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)


	Mat src = imread("D:/opencv/pictures/3 (3).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.rotate_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;


二十二、视频文件摄像头使用

知识点:

  • VideoCapture capture(“D:/opencv/pictures/1234.mp4”); //读取视频的地址
  • capture.read(frame); //读取视频
  • capture.release();//释放资源

22.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象

public:
	void video_demo(Mat &image);
	void colorSpace_Demo(Mat &image);
;

22.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>

void QuickDemo::colorSpace_Demo(Mat &image)

	Mat gray, hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	cvtColor(image, gray, COLOR_BGR2GRAY);
	imshow("HSV", hsv);
	imshow("灰度", gray);



void QuickDemo::video_demo(Mat &image)

	VideoCapture capture("D:/opencv/pictures/1234.mp4");  //读取视频的地址
	//VideoCapture capture(0);//读取当前摄像头的图像
	Mat frame;//定义一个二值化的 frame

	while (true)
	
		capture.read(frame); //读取视频
		//flip(frame, frame, 1);//对视频帧进行翻转操作
		if (frame.empty())//保证视频不为空
		
			break;
		
		imshow("frame", frame);//显示视频
		colorSpace_Demo(frame);//对视频帧进行颜色空间转换
		int c = waitKey(100);
		if (c == 27)  //esc 退出
			break;
		
	
	capture.release();//释放资源





22.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)


	Mat src = imread("D:/opencv/pictures/3 (3).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.video_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;


二十三、视频处理与保存

知识点:

  • int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);//获取视频宽
  • int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);//获取视频高
  • int count = capture.get(CAP_PROP_FRAME_COUNT);//获取视频总帧数
  • double fps = capture.get(CAP_PROP_FPS);//获取视频的FPS
  • VideoWriter writer("D:/opencv/pictures//test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);//保存视频。参数1输出文件名;参数2编码形式;参数3输出帧率;参数4输出尺寸;参数5如果为False,可以传入灰度图片。

23.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象

public:
	void video_demo2(Mat &image);
	void colorSpace_Demo(Mat &image);
;

23.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>

void QuickDemo::colorSpace_Demo(Mat &image)

	Mat gray, hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	cvtColor(image, gray, COLOR_BGR2GRAY);
	imshow("HSV", hsv);
	imshow("灰度", gray);


void QuickDemo::video_demo2(Mat &image)

	VideoCapture capture("D:/opencv/pictures/1234.mp4");
	int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);//获取视频宽
	int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);//获取视频高
	int count = capture.get(CAP_PROP_FRAME_COUNT);//获取视频总帧数
	double fps = capture.get(CAP_PROP_FPS);//获取视频的FPS

	//打印上面的这些数值
	std::cout << "frame width" << frame_width << std::endl;
	std::cout << "frame height" << frame_height << std::endl;
	std::cout << "frame FPS" << fps << std::endl;
	std::cout << "frame count" << count << std::endl;
	//保存视频
	VideoWriter writer("D:/opencv/pictures//test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);
	
	Mat frame;
	while (true)
	
		capture.read(frame);
		//flip(frame, frame, 1);//翻转操作
		if (frame.empty())
		
			break;
		
		imshow("frame", frame);
		colorSpace_Demo(frame);
		writer.write(frame);

		int c = waitKey(100);
		if (c == 27)  //esc 退出程序
			break;
		
	
	capture.release();//释放相机的资源
	writer.release();//释放存放的资源


23.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)


	Mat src = imread("D:/opencv/pictures/3 (3).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.video_demo2(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;


二十四、图像的直方图

知识点:

  • calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);//参数分别为:源图像矩阵;源图像数量;源图像通道;掩膜;直方图输出值;输出直方图的维度;统计像素值的区间;等。

24.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象

public:
	void histogram_demo(Mat &image);
	
	
;

24.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>

void QuickDemo::histogram_demo(Mat &image)

	//三通道分离
	std::vector<Mat>bgr_plane;
	split(image, bgr_plane);
	//定义参数变量
	const int channels[1] =  0 ;
	const int bins[1] =  256 ;
	float hranges[2] =  0,255 ;
	const float* ranges[1] =  hranges ;

	Mat b_hist;
	Mat g_hist;
	Mat r_hist;
	//计算Blue,Green,Red通道的直方图
	calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);
	calcHist(&bgr_plane[1], 1, 0, Mat(), g_hist, 1, bins, ranges);
	calcHist(&bgr_plane[2], 1, 0, Mat(), r_hist, 1, bins, ranges);
	//显示直方图
	int hist_w = 480;
	int hist_h = 320;
	int bin_w = cvRound((double)hist_w / bins[0]);
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
	//归一化直方图数据
	normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	//绘制直方图曲线
	for (int i = 1; i < bins[0]; i++)
	
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);

	
	//显示直方图
	namedWindow("Histogram Demo", WINDOW_AUTOSIZE);
	imshow("Histogram Demo", histImage);

24.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)


	Mat src = imread("D:/opencv/pictures/3 (3).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -

OpenCV4 图像处理与视频分析实战教程

OpenCV4 图像处理与视频分析实战教程

基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载

1 OpenCV4.0概述与环境搭建.mp4
2 第一个测试程序.mp4
3 图像加载与保存.mp4
4 认识Mat对象.mp4
5 Mat对象创建与使用.mp4
6 遍历与访问每个像素.mp4
7 图像算术操作.mp4
8 图像位操作.mp4
9 像素信息统计.mp4
10 图形绘制与填充.mp4
11 图像通道合并与分离.mp4
12 图像直方图统计.mp4
13 图像直方图均衡化.mp4
14 图像直方图相似比较.mp4
15 图像查找表与颜色表.mp4
16 图像卷积.mp4
17 卷积边缘处理.mp4
18 图像模糊.mp4
19 自定义滤波.mp4
20 图像梯度.mp4
21 图像边缘发现.mp4
22 USM锐化.mp4
23 图像噪声.mp4
24 图像去噪声.mp4
25 边缘保留滤波.mp4
26 边缘提取.mp4
27 二值图像概念.mp4
28 全局阈值.mp4
29 自适应阈值.mp4
30 联通组件扫描.mp4
31 带统计信息的联通组件扫描.mp4
32 图像轮廓发现.mp4
33 图像轮廓计算.mp4
34 轮廓匹配.mp4
35 轮廓逼近与拟合.mp4
36 霍夫直线检测.mp4
37 直线类型与线段.mp4
38 霍夫圆检测.mp4
39 图像形态学操作-腐蚀与膨胀.mp4
40 开闭操作.mp4
41 形态学梯度.mp4
42 更多形态学操作.mp4
43 图像分析 案例实战一.mp4
44 视频读写.mp4
45 图像色彩空间转换.mp4
46 直方图反向投影.mp4
47 Harris角点检测.mp4
48 shi-tomasi角点检测.mp4
49 基于颜色的对象跟踪.mp4
50 背景分析.mp4
51 光流分析 - 光流法原理.mp4
52 光流法-代码演示.mp4
53 稀疏光流分析-绘制跟踪.mp4
54 光流分析之稠密光流法.mp4
55 基于均值迁移的视频分析.mp4
56 自适应均值迁移与课程总结.mp4

课程资料
OpenCV4 图像处理与视频分析教程-01-01.pdf
OpenCV4 图像处理与视频分析教程-02-01.pdf
OpenCV4 图像处理与视频分析教程-03-01.pdf
OpenCV4 图像处理与视频分析教程-04-01.pdf
OpenCV4 图像处理与视频分析教程-05-01.pdf
OpenCV4 图像处理与视频分析教程-06-01.pdf
OpenCV4 图像处理与视频分析教程-07-01.pdf
OpenCV4 图像处理与视频分析教程-08-01.pdf
OpenCV4 图像处理与视频分析教程-09-01.pdf
OpenCV4 图像处理与视频分析教程-10-01.pdf
OpenCV4 图像处理与视频分析教程-11-01.pdf
OpenCV4 图像处理与视频分析教程-12-01.pdf
OpenCV4 图像处理与视频分析教程-13-01.pdf
OpenCV4 图像处理与视频分析教程-14-01.pdf
OpenCV4 图像处理与视频分析教程-15-01.pdf
OpenCV4 图像处理与视频分析教程-16-01.pdf
OpenCV4 图像处理与视频分析教程-17-01.pdf
OpenCV4 图像处理与视频分析教程-18-01.pdf
OpenCV4 图像处理与视频分析教程-19-01.pdf
OpenCV4 图像处理与视频分析教程-20-01.pdf
OpenCV4 图像处理与视频分析教程-21-01.pdf
OpenCV4 图像处理与视频分析教程-22-01.pdf
OpenCV4 图像处理与视频分析教程-23-01.pdf
OpenCV4 图像处理与视频分析教程-24-01.pdf
OpenCV4 图像处理与视频分析教程-25-01.pdf
OpenCV4 图像处理与视频分析教程-26-01.pdf
OpenCV4 图像处理与视频分析教程-27-01.pdf
OpenCV4 图像处理与视频分析教程-28-01.pdf
OpenCV4 图像处理与视频分析教程-29-01.pdf
OpenCV4 图像处理与视频分析教程-30-01.pdf
OpenCV4 图像处理与视频分析教程-31-01.pdf
OpenCV4 图像处理与视频分析教程-32-01.pdf
OpenCV4 图像处理与视频分析教程-33-01.pdf
OpenCV4 图像处理与视频分析教程-34-01.pdf
OpenCV4 图像处理与视频分析教程-35-01.pdf
OpenCV4 图像处理与视频分析教程-36-01.pdf
OpenCV4 图像处理与视频分析教程-37-01.pdf
OpenCV4 图像处理与视频分析教程-38-01.pdf
OpenCV4 图像处理与视频分析教程-39-01.pdf
OpenCV4 图像处理与视频分析教程-40-01.pdf
OpenCV4 图像处理与视频分析教程-41-01.pdf
OpenCV4 图像处理与视频分析教程-42-01.pdf
OpenCV4 图像处理与视频分析教程-43-总结-01.pdf
OpenCV4 图像处理与视频分析教程-概述-01.pdf
课程源码-01.zip

 

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

以上是关于OpenCV(C++版本)基础相关:图像的旋转视频文件摄像头使用视频处理与保存图像的直方图二维直方图的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV4 图像处理与视频分析实战教程

在界面上使用带有 C++ 的 OpenCV 旋转图像

OpenCV3.x视频教程出来啦!

OpenCV源码解析

如何更改此 C++ (OpenCV) 代码以获取图像而不是视频?

OpenCV:录制扭曲的视频