OpenCV图像与视频处理及数据类型详解
立即解锁
发布时间: 2025-08-21 01:23:42 阅读量: 1 订阅数: 7 


OpenCV 3计算机视觉实战指南
### OpenCV 图像与视频处理及数据类型详解
#### 1. 图像像素信息获取与输出
在处理图像时,我们常常需要获取像素的颜色信息。以下代码展示了如何获取图像中某一点的蓝、绿、红通道的强度值,并输出该点的颜色信息、灰度值以及金字塔图像的像素值,同时还可以设置 Canny 边缘检测图像中对应点的值。
```cpp
uchar blue = intensity[0];
uchar green = intensity[1];
uchar red = intensity[2];
std::cout << "At (x,y) = (" << x << ", " << y <<
"): (blue, green, red) = (" <<
(unsigned int)blue <<
", " << (unsigned int)green << ", " <<
(unsigned int)red << ")" << std::endl;
std::cout << "Gray pixel there is: " <<
(unsigned int)img_gry.at<uchar>(y, x) << std::endl;
x /= 4; y /= 4;
std::cout << "Pyramid2 pixel there is: " <<
(unsigned int)img_pyr2.at<uchar>(y, x) << std::endl;
img_cny.at<uchar>(x, y) = 128; // Set the Canny pixel there to 128
```
上述代码中,`intensity` 数组存储了像素的颜色强度信息,通过索引可以分别获取蓝、绿、红通道的值。然后使用 `std::cout` 输出这些信息,方便我们查看。同时,对 `x` 和 `y` 进行缩放后,可以获取金字塔图像中对应点的像素值。最后,将 Canny 边缘检测图像中对应点的值设置为 128。
#### 2. 从相机或文件读取视频
在计算机视觉中,我们可能需要处理来自相机的实时视频流,也可能需要处理存储在磁盘上的视频文件。OpenCV 提供了 `cv::VideoCapture` 对象来方便地实现这一功能。以下是一个示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char** argv ) {
cv::namedWindow( "Example2_10", cv::WINDOW_AUTOSIZE );
cv::VideoCapture cap;
if (argc==1) {
cap.open(0); // open the first camera
} else {
cap.open(argv[1]);
}
if( !cap.isOpened() ) { // check if we succeeded
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
// The rest of program proceeds as in Example 2-3
...
}
```
在这个示例中,如果运行程序时没有提供文件名参数(即 `argc==1`),则尝试打开系统的第一个相机;如果提供了文件名参数,则打开该文件。同时,使用 `cap.isOpened()` 检查是否成功打开相机或文件,如果失败则输出错误信息并返回 -1。
#### 3. 写入 AVI 文件
在很多应用场景中,我们需要将处理后的视频流或捕获的图像保存为视频文件。OpenCV 提供了 `cv::VideoWriter` 对象来实现这一功能。以下是一个完整的程序示例,它可以读取一个彩色视频文件,将其转换为对数极坐标格式,并将转换后的图像写入一个新的视频文件:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char* argv[] ) {
cv::namedWindow( "Example2_11", cv::WINDOW_AUTOSIZE );
cv::namedWindow( "Log_Polar", cv::WINDOW_AUTOSIZE );
cv::VideoCapture capture( argv[1] );
double fps = capture.get( cv::CAP_PROP_FPS );
cv::Size size(
(int)capture.get( cv::CAP_PROP_FRAME_WIDTH ),
(int)capture.get( cv::CAP_PROP_FRAME_HEIGHT )
);
cv::VideoWriter writer;
writer.open( argv[2], CV_FOURCC('M','J','P','G'), fps, size );
cv::Mat logpolar_frame, bgr_frame;
for(;;) {
capture >> bgr_frame;
if( bgr_frame.empty() ) break; // end if done
cv::imshow( "Example2_11", bgr_frame );
cv::logPolar(
bgr_frame, // Input color frame
logpolar_frame, // Output log-polar frame
cv::Point2f( // Centerpoint for log-polar transformation
bgr_frame.cols/2, // x
bgr_frame.rows/2 // y
),
40, // Magnitude (scale parameter)
cv::WARP_FILL_OUTLIERS // Fill outliers with 'zero'
);
cv::imshow( "Log_Polar", logpolar_frame );
writer << logpolar_frame;
char c = cv::waitKey(10);
if( c == 27 ) break; // allow the user to break out
}
capture.release();
}
```
这个程序的主要步骤如下:
1. 打开输入视频文件,并获取视频的帧率和尺寸信息。
2. 创建 `cv::VideoWriter` 对象,并使用 `open` 方法打开输出视频文件,指定视频编码器(这里使用 MJPG 编码器)、帧率和尺寸。
3. 循环读取输入视频的每一帧,将其转换为对数极坐标格式,并显示原始帧和转换后的帧。
4. 将转换后的帧写入输出视频文件。
5. 当用户按下 Esc 键或视频读取结束时,退出循环并释放资源。
#### 4. OpenCV 数据类型概述
OpenCV 拥有丰富的数据类型,这些数据类型旨在使计算机视觉中重要概念的表示和处理变得相对简单和直观。从组织角度来看,这些数据类型可以分为三大类:
1. **基本数据类型**:由 C++ 基本类型(如 `int`、`float` 等)直接组装而成,包括简单的向量和矩阵,以及点、矩形、尺寸等简单几何概念的表示。
2. **辅助对象**:表示更抽象的
0
0
复制全文
相关推荐










