【OpenCV】vector<Mat> 视频截取为图片的实例

  1. images.push_back(img);  

  1. images.push_back(img.clone());  
视频转换为图片的例子:
    1. #include <opencv2/opencv.hpp>  
    2. #include <sstream>  
    3.   
    4. using namespace cv;  
    5. using namespace std;  
    6.   
    7. int main()  
    8. {  
    9.     VideoCapture cap("Sample.avi");  
    10.     if (!cap.isOpened())  
    11.     {  
    12.         cout << "Can't open input video file" << endl;  
    13.         return -1;  
    14.     }  
    15.   
    16.     Mat img;  
    17.     vector<Mat> images;  
    18.     int count = 0;  
    19.     while (cap.read(img))  
    20.     {  
    21.         if (img.empty())  
    22.         {  
    23.             cout << "Stop" << endl;  
    24.             break;  
    25.         }  
    26.         // 实验需要在这里通过count来限制只取100帧  
    27.         if (count < 100)  
    28.         {  
    29.             // images.push_back(img);  
    30.             images.push_back(img.clone());</span>  
    31.         }  
    32.         count++;  
    33.     }  
    34.   
    35.       
    36.     int n = 0;  
    37.     vector<Mat>::iterator it = images.begin();  
    38.     while (it != images.end())  
    39.     {  
    40.         Mat tmp = *it;  
    41.         stringstream ss;  
    42.         ss << n;  
    43.         n++;  
    44.         imwrite(ss.str() + ".jpg", tmp);  
    45.         imshow("tmp", tmp);  
    46.   
    47.         it++;  
    48.   
    49.         waitKey(10);  
    50.     }  
    51.   
    52.     return 0;  
    53. }  

<think>我们正在将MATLAB代码转换为C++ OpenCV代码。具体来说,我们需要转换MATLAB中的`M = size(BW1, 3)`这行代码,其中`BW1`在C++中是一个`vector<Mat>`(即一个包含多个Mat的向量)。 在MATLAB中,`size(BW1, 3)`返回数组`BW1`在第三维的大小。如果`BW1`是一个三维数组,那么第三维通常表示通道数或图像序列的深度。但在我们的上下文中,`BW1`被定义为`vector<Mat>`,这意味着它是一个包含多个OpenCV Mat对象的向量。每个Mat对象代表一个图像(可能是多通道的)。 然而,在MATLAB中,如果`BW1`是一个三维数组,那么它可能表示一个由多个二维图像组成的堆栈(stack),其中第三维是图像索引。例如,一个`m×n×p`的三维数组可以看作`p`个`m×n`的图像。 在C++ OpenCV中,我们用`vector<Mat>`来表示这样的图像序列,其中向量的大小就是图像的数量(相当于MATLAB第三维的大小)。 因此,`M = size(BW1, 3)`在C++中应该对应于获`vector<Mat>`中Mat的数量,即向量的长度。 所以,转换后的C++代码应该是: ```cpp int M = BW1.size(); ``` 这里,`BW1`是一个`vector<Mat>`,`BW1.size()`返回向量中元素的数量,即图像的数量。 但是,请注意:在MATLAB中,`size(BW1,3)`返回第三维的大小,而如果`BW1`是一个二维矩阵,那么第三维的大小为1。而在OpenCV中,如果`vector<Mat>`中只有一个Mat,那么`BW1.size()`返回1,这与MATLAB的行为一致。 因此,我们可以直接使用`BW1.size()`来得到第三维的大小。 另外,如果MATLAB代码中`BW1`可能是一个二维矩阵(即第三维为1),那么在C++中,我们可能只有一个Mat在向量中,所以`BW1.size()`就是1。 所以,总结:转换后的C++代码就是获`vector<Mat>`的大小。 示例: ```cpp #include <vector> #include <opencv2/opencv.hpp> int main() { std::vector<cv::Mat> BW1; // ... 假设我们向BW1中添加了一些Mat // 获第三维的大小(图像数量) int M = BW1.size(); return 0; } ``` 注意:在MATLAB中,`size(BW1,3)`也可能用于其他多维数组,但根据问题描述,`BW1`在C++中是一个`vector<Mat>`,所以我们直接使用向量的大小。 如果原始MATLAB代码中的`BW1`是一个三维数组,而我们用`vector<Mat>`表示,那么每个Mat应该是二维的(即单张图像),而向量的长度就是第三维的大小。 因此,这个转换是合理的。</think>将 MATLAB 代码 `M = size(BW1, 3)` 转换为 C++ OpenCV 代码时,需要理解两者的数据结构差异。以下是转换方法和解释: ### 转换方案 ```cpp // 假设 BW1 是 vector<Mat> 类型 int M = BW1.empty() ? 0 : BW1[0].channels(); ``` ### 关键点解析 1. **MATLAB 的 `size(,3)` 含义** 在 MATLAB 中,`size(BW1,3)` 获多维数组第三维的大小,对于图像数据通常表示**通道数**(如 RGB 图像的通道数为 3)[^1]。 2. **OpenCV数据结构** 在 `vector<Mat>` 中: - 每个 `Mat` 元素代表一个图像 - `Mat::channels()` 直接返回当前图像的通道数 - 向量长度 (`BW1.size()`) 表示图像数量 3. **转换逻辑** ```cpp int M = BW1[0].channels(); // 获第一个图像的通道数 ``` - 使用 `BW1[0]` 因为 `vector<Mat>` 中所有图像应有相同通道数 - 添加空向量检查 (`BW1.empty()`) 避免运行时错误 ### 完整示例 ```cpp #include <opencv2/opencv.hpp> #include <vector> using namespace cv; using namespace std; int main() { vector<Mat> BW1; // 假设已向 BW1 添加若干图像(如通过 imread 加载) // MATLAB: M = size(BW1, 3) 的等效代码 int M = BW1.empty() ? 0 : BW1[0].channels(); cout << "通道数: " << M << endl; // 例如 RGB 图像输出 3 return 0; } ``` ### 注意事项 1. **通道一致性** 确保 `vector<Mat>` 中所有图像的通道数相同(如都是灰度图或都是 RGB 图) 2. **维度差异** - MATLAB 的第三维 `size(,3)` 对应 OpenCV 的 `channels()` - 图像数量需通过 `BW1.size()` 获(MATLAB 的第四维) 3. **特殊场景** 若处理非图像的多维数据(如 3D 体数据),需改用 `cv::Mat` 的高维数组(如 `Mat::dims == 3`),此时通道数需重新设计数据结构。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值