如何用C++和opencv结合读取一帧图片的长度和宽度
时间: 2024-09-26 16:14:24 浏览: 42
在C++中,利用OpenCV库读取图像的尺寸(长度和宽度)非常直观。以下是一个简单的步骤:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 加载图像
cv::Mat image = cv::imread("image_path.jpg"); // 替换为你的图片路径
// 检查图像是否成功加载
if (image.empty()) {
std::cout << "Failed to load the image" << std::endl;
return -1;
}
// 获取图像的尺寸(宽度和高度)
int width = image.cols; // cols代表宽度
int height = image.rows; // rows代表高度
std::cout << "Image width: " << width << ", Image height: " << height << std::endl;
return 0;
}
```
在这个例子中,`cv::imread()`函数用于从指定路径读取图像,如果加载失败,会返回一个空矩阵。然后我们通过`.cols`获取列数(宽度),`.rows`获取行数(高度)。
相关问题
用C++和opencv写一个相机标定代码
以下是使用OpenCV进行相机标定的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
int numBoards = 10; // 拍摄10张图片
int boardWidth = 9; // 棋盘格宽度为9个方格
int boardHeight = 6; // 棋盘格高度为6个方格
float squareSize = 0.02423f; // 单个方格的物理大小
Size boardSize(boardWidth, boardHeight);
vector<vector<Point3f>> objectPoints;
vector<vector<Point2f>> imagePoints;
vector<Point2f> corners;
Mat gray, img;
VideoCapture cap(0); // 创建相机对象
if (!cap.isOpened()) // 检查相机是否打开
{
cout << "Failed to open camera." << endl;
return -1;
}
namedWindow("Camera Calibration", WINDOW_NORMAL);
while (numBoards > 0)
{
cap >> img; // 从相机读取一帧图像
cvtColor(img, gray, COLOR_BGR2GRAY);
bool found = findChessboardCorners(gray, boardSize, corners,
CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
if (found)
{
drawChessboardCorners(img, boardSize, corners, found);
vector<Point3f> obj;
for (int i = 0; i < boardHeight; i++)
{
for (int j = 0; j < boardWidth; j++)
{
obj.push_back(Point3f((float)j * squareSize, (float)i * squareSize, 0));
}
}
objectPoints.push_back(obj);
imagePoints.push_back(corners);
numBoards--;
}
imshow("Camera Calibration", img);
waitKey(1);
}
destroyWindow("Camera Calibration");
Mat cameraMatrix, distCoeffs;
vector<Mat> rvecs, tvecs;
calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
cout << "Camera matrix:" << endl << cameraMatrix << endl;
cout << "Distortion coefficients:" << endl << distCoeffs << endl;
return 0;
}
```
在此代码中,我们首先定义了一些变量,包括要拍摄的图片数量,棋盘格的大小和单个方格的物理大小。然后,我们创建了一个相机对象,并检查是否成功打开了相机。接着,我们在一个循环中捕获相机图像,并使用`findChessboardCorners`函数检测棋盘格的角点。如果检测到了棋盘格,我们将角点保存到`imagePoints`向量中,并将对应的物理坐标保存到`objectPoints`向量中。当拍摄到足够多的图片后,我们使用`calibrateCamera`函数进行相机标定,并输出相机矩阵和畸变系数。
请注意,本示例代码仅用于演示目的。在实际应用中,可能需要更多的检测和校准步骤以获得更准确的结果。
请给出C++使用OpenCV将视频每一帧图片中固定字幕以图片形式保存的代码
以下是使用OpenCV将视频每一帧图片中固定字幕以图片形式保存的C++代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main()
{
// 打开视频文件
VideoCapture cap("video.mp4");
// 检查视频是否打开
if (!cap.isOpened())
{
cerr << "Error opening video file" << endl;
return -1;
}
// 获取视频的帧率、宽度和高度
double fps = cap.get(CAP_PROP_FPS);
int width = cap.get(CAP_PROP_FRAME_WIDTH);
int height = cap.get(CAP_PROP_FRAME_HEIGHT);
// 创建一个用于保存视频帧的Mat对象
Mat frame;
// 创建一个用于绘制字幕的Mat对象
Mat subtitle(height, width, CV_8UC3, Scalar(255, 255, 255));
// 设置字幕的文本和字体
string text = "Hello, world!";
int fontFace = FONT_HERSHEY_SIMPLEX;
double fontScale = 1;
int thickness = 2;
int baseline = 0;
Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);
// 计算字幕的位置
Point textOrg((width - textSize.width) / 2, (height + textSize.height) / 2);
// 循环读取视频帧
while (cap.read(frame))
{
// 将字幕绘制到视频帧上
rectangle(subtitle, textOrg + Point(0, baseline), textOrg + Point(textSize.width, -textSize.height), Scalar(0, 0, 0), FILLED);
putText(subtitle, text, textOrg, fontFace, fontScale, Scalar(255, 255, 255), thickness);
// 将字幕和视频帧叠加起来
Mat result;
addWeighted(frame, 1, subtitle, 0.5, 0, result);
// 保存叠加后的图像
string filename = "frame_" + to_string(cap.get(CAP_PROP_POS_FRAMES)) + ".jpg";
imwrite(filename, result);
}
// 释放视频流
cap.release();
return 0;
}
```
注意,以上代码假设你已经安装了OpenCV库,并且将视频文件命名为"video.mp4",可以根据需要进行修改。
阅读全文