1.前言
使用了python版本的opencv接口,现在使用c++版本的opencv,感觉接口还是挺熟悉的,写一下当做记录,为了熟悉一下api就没有使用cv的命名空间。
2.OpenCV-API使用
2.1图片的操作
#include <opencv2/opencv.hpp>
#include <iostream>
// using namespace cv;
using namespace std;
int main() {
// 读取图片
cv::Mat image = cv::imread("1.jpg");
// 检查图片是否成功加载
if (image.empty()) {
cout << "Error: Unable to read the image." << endl;
return -1;
}
// 图片变灰度
cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
// 图片BGR转RGB
cv::Mat rgbImage;
cv::cvtColor(image, rgbImage, cv::COLOR_BGR2RGB);
// 图片保存
cv::imwrite("path/to/save/image.jpg", image);
// 获取图片的宽和高
int width = image.cols;
int height = image.rows;
cout << "Width: " << width << ", Height: " << height << endl;
// 图片修改分辨率
cv::resize(image, image, cv::Size(640, 480));
cv::imshow("Resized Image", image);
cv::waitKey(0);
// (图片数据类型的介绍和转换
cout << "Original Image Data Type: " << image.type() << endl;
cv::Mat floatImage;
image.convertTo(floatImage, CV_32F);
cout << "Converted Image Data Type: " << floatImage.type() << endl;
// 展示图片
cv::imshow("Original Image", image);
cv::waitKey(0);
}
2.2视频的操作
#include <opencv2/opencv.hpp>
#include <iostream>
// using namespace cv;
using namespace std;
int main()
{
// 读取视频或者摄像头数据
cv::VideoCapture cap("path/to/your/video.mp4"); // 或者使用摄像头,例如:VideoCapture cap(0);
// 检查视频是否成功打开
if (!cap.isOpened()) {
cout << "Error: Unable to open the video source." << endl;
return -1;
}
// 展示视频或者摄像头数据
while (true) {
cv::Mat frame;
cap >> frame;
// 如果成功读取帧
if (!frame.empty()) {
cv::imshow("Video", frame);
// 按 'q' 键退出循环
if (cv::waitKey(25) == 'q') {
break;
}
} else {
// 如果未能读取帧,说明已到达视频末尾,退出循环
break;
}
}
// 视频或者摄像头数据变灰度
cv::VideoCapture cap2("path/to/your/video.mp4"); // 或者使用摄像头,例如:VideoCapture cap(0);
// 检查视频是否成功打开
if (!cap2.isOpened()) {
cout << "Error: Unable to open the video source." << endl;
return -1;
}
while (true) {
cv::Mat frame;
cap2 >> frame;
// 如果成功读取帧
if (!frame.empty()) {
cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);
cv::imshow("Gray Video", frame);
// 按 'q' 键退出循环
if (cv::waitKey(25) == 'q') {
break;
}
} else {
// 如果未能读取帧,说明已到达视频末尾,退出循环
break;
}
}
// 视频或者摄像头数据的保存
cv::VideoCapture cap3("path/to/your/video.mp4"); // 或者使用摄像头,例如:VideoCapture cap(0);
// 检查视频是否成功打开
if (!cap3.isOpened()) {
cout << "Error: Unable to open the video source." << endl;
return -1;
}
int frameWidth = cap3.get(cv::CAP_PROP_FRAME_WIDTH);
int frameHeight = cap3.get(cv::CAP_PROP_FRAME_HEIGHT);
cv::VideoWriter videoWriter("path/to/save/video.avi", cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 10,
cv::Size(frameWidth, frameHeight));
while (true) {
cv::Mat frame;
cap3 >> frame;
// 如果成功读取帧
if (!frame.empty()) {
videoWriter.write(frame);
// 按 'q' 键退出循环
if (cv::waitKey(25) == 'q') {
break;
}
} else {
// 如果未能读取帧,说明已到达视频末尾,退出循环
break;
}
}
// 获取视频或者摄像头数据的宽和高
int videoWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int videoHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
cout << "Video Width: " << videoWidth << ", Video Height: " << videoHeight << endl;
// 视频或者摄像头数据修改分辨率
cv::VideoCapture cap4("path/to/your/video.mp4"); // 或者使用摄像头,例如:VideoCapture cap(0);
// 检查视频是否成功打开
if (!cap4.isOpened()) {
cout << "Error: Unable to open the video source." << endl;
return -1;
}
int newWidth = 640;
int newHeight = 480;
cv::VideoWriter videoWriter2("path/to/save/video_resized.avi", cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 10,
cv::Size(newWidth, newHeight));
while (true) {
cv::Mat frame;
cap4 >> frame;
// 如果成功读取帧
if (!frame.empty()) {
cv::resize(frame, frame, cv::Size(newWidth, newHeight));
videoWriter2.write(frame);
// 按 'q' 键退出循环
if (cv::waitKey(25) == 'q') {
break;
}
} else {
// 如果未能读取帧,说明已到达视频末尾,退出循环
break;
}
}
// 视频或者摄像头数据数据类型的介绍和转换
int videoDataType = cap.get(cv::CAP_PROP_FORMAT);
cout << "Video Data Type: " << videoDataType << endl;
return -1;
}