赞
踩
图像在 OpenCV 中的本质
在 OpenCV 中,图像被表示为一个多维数组,其中每个元素对应于图像中的单个像素。图像的维度取决于其通道数和像素数。
图像存储方式
OpenCV 中的图像通常以以下格式存储:
Mat 中图像的存储
Mat 中的图像数据以行优先顺序存储。这意味着图像的第一个维度对应于行,而第二个维度对应于列。对于一个 3 通道的彩色图像,Mat 中的元素顺序如下:
[B00, G00, R00, B01, G01, R01, ..., Bmn, Gmn, Rmn]
其中:
B
、G
、R
表示蓝色、绿色和红色通道m
和 n
是图像的高度和宽度通道的顺序
OpenCV 中图像的通道顺序通常为 BGR(蓝色、绿色、红色)。这与其他一些图像处理库(如 PIL)中使用的 RGB 顺序不同。
其他图像存储格式
除了 Mat 和 IplImage 之外,OpenCV 还支持其他图像存储格式,包括:
- #include <iostream>
- #include "opencv2/core.hpp"
- #include <opencv2/imgcodecs.hpp>
- #include <opencv2/highgui.hpp>
-
- using namespace std;
- using namespace cv;
-
- int main(){
- Mat image;
- image = imread("firefox.png"); //imread()读取图片
- if(!image.empty()){
- imshow("1",image); //imshow展示图片,前面为展示名,后面为图片。
- waitKey(0);
- }
- destroyAllWindows();
-
- return 0;
- }
从文件读取图片并显示
waitKey(0)
是 OpenCV 中的一个函数,用于等待用户按下一个键。它有以下作用:
waitKey(0)
会暂停程序执行,直到用户按下一个键。这通常用于在显示图像或视频时让用户有机会查看内容。waitKey(0)
会返回该键的 ASCII 码。这可用于检测用户输入并做出相应操作。waitKey(0)
的参数为 0 表示无限等待。这意味着程序将一直暂停,直到用户按下一个键。使用示例:
- cv::Mat image = cv::imread("image.png");
-
- cv::imshow("Image", image);
-
- cv::waitKey(0);
在上面的示例中,程序将暂停执行,直到用户按下一个键。然后,程序将继续执行,关闭图像窗口并释放资源。
注意:
waitKey(0)
是一个阻塞函数,这意味着它会阻止程序执行,直到用户按下一个键。waitKey(1)
,它将等待 1 毫秒的按键输入。如果在此期间没有按键输入,程序将继续执行。waitKey(0)
通常用于交互式应用程序,例如图像查看器或视频播放器。展示结果:
- #include <iostream>
- #include "opencv2/core.hpp"
- #include <opencv2/imgcodecs.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/core/mat.hpp>
- #include <opencv2/imgproc.hpp>
-
- using namespace std;
- using namespace cv;
-
- int main(){
- Mat image;
- image = imread("firefox.png"); //imread()读取图片
- if(!image.empty()){
- imshow("image",image); //imshow展示图片,前面为展示名,后面为图片。
- waitKey(0);
- }
- // destroyAllWindows();
-
- Mat resize_image;
- resize(image, resize_image, Size(), 1, 0.5); //resize()改变大小 前为高度 后为宽度
-
- if(!image.empty()){
- imshow("resize",resize_image);
- waitKey(0);
- }
- imwrite("resize.png",resize_image); //imwrite(文件名,图片)写入文件 需要指定扩展名,否则exception
- destroyAllWindows();
- return 0;
- }
getRotationMatrix2D()和warpAffine()函数
- Mat rotated_image;
-
- double angle = 90; //旋转角度
- Point2f center(image.cols / 2.0, image.rows / 2.0); //获取旋转中心
- Mat rotation_matix = getRotationMatrix2D(center, angle, 0.5); //getRotationMatrix2D()计算旋转矩阵 参数:旋转中心、旋转角度、放大倍数
- warpAffine(image, rotated_image, rotation_matix, image.size()); //warpAffine旋转图片 参数:原图、目标图片、旋转矩阵、生成图片的大小
-
-
- if(!rotated_image.empty()){
- imshow("rotate",rotated_image);
- waitKey(0);
- }
- imwrite("rotate.png",rotated_image);
- destroyAllWindows();
Point2f 是 OpenCV 中的一个结构,用于表示二维点。它包含两个浮点成员:x
和 y
,分别表示点的横坐标和纵坐标。
声明:
- struct Point2f {
- float x;
- float y;
-
- };
构造函数:
Point2f
,其中 x
和 y
都为 0。Point2f
,其中 x
和 y
设置为指定的值。warpAffine()函数和平移矩阵
平移矩阵:
平移矩阵是一个 2x3 的仿射变换矩阵,
- [ 1 0 tx ]
-
- [ 0 1 ty ]
其中:
tx
是水平平移量。ty
是垂直平移量。为tx提供正值将使图像向右移动,而负值将使图像向左移动。
同样,ty值为正值时,图像会向下平移,而ty值为负值时,图像会向上平移。
warpAffine()本质是仿射变换。
可以使用 OpenCV 的 namedWindow()
函数来设置 imshow()
窗口的大小。
示例:
- cv::namedWindow("Image", cv::WINDOW_NORMAL); // 创建一个可调整大小的窗口
-
- cv::imshow("Image", image);
-
- // 设置窗口大小
-
- cv::resizeWindow("Image", 640, 480);
参数:
WINDOW_NORMAL
创建一个可调整大小的窗口。其他标志:
注意:
namedWindow()
函数必须在 imshow()
函数之前调用。WINDOW_NORMAL
标志创建的窗口)。在 OpenCV 中,可以使用 hconcat()
和 vconcat()
函数水平和垂直拼接图像。
水平拼接(并排):
- cv::Mat image1 = cv::imread("image1.png");
-
- cv::Mat image2 = cv::imread("image2.png");
-
- cv::Mat拼接图像;
-
- cv::hconcat(std::vector[cv::Mat](cv::Mat){image1, image2},拼接图像);
垂直拼接(上下):
- cv::Mat image1 = cv::imread("image1.png");
-
- cv::Mat image2 = cv::imread("image2.png");
-
- cv::Mat拼接图像;
-
- cv::vconcat(std::vector[cv::Mat](cv::Mat){image1, image2},拼接图像);
参数:
注意:
hconcat()
和 vconcat()
函数将自动调整图像大小以匹配。在 OpenCV 中,可以使用 flip()
函数水平或垂直翻转图像。
水平翻转:
- cv::Mat image = cv::imread("image.png");
-
- cv::Mat flipped_image;
-
- // 水平翻转
-
- cv::flip(image, flipped_image, 1);
垂直翻转:
- cv::Mat image = cv::imread("image.png");
-
- cv::Mat flipped_image;
-
- // 垂直翻转
-
- cv::flip(image, flipped_image, 0);
参数:
flipCode 标志:
注意:
在 OpenCV 中,可以使用 GaussianBlur() 函数对图像应用高斯模糊。
示例:
- cv::Mat image = cv::imread("image.png");
- cv::Mat blurred_image;
-
- // 高斯模糊
- cv::GaussianBlur(image, blurred_image, cv::Size(5, 5), 0);
参数:
**image:**要模糊的图像。
**blurred_image:**用于存储模糊后图像的 Mat 对象。
**kernel_size:**模糊核的大小。它必须是一个奇数。
**sigmaX:**高斯核在 x 方向的标准偏差。如果为 0,则从 kernel_size 计算。
注意:
高斯模糊是一种线性滤波器,它使用高斯核来平滑图像。
高斯核是一个钟形曲线,其中心权重最大,边缘权重逐渐减小。
kernel_size 越大,模糊效果越强。
sigmaX 越大,模糊效果越明显。
高斯模糊可能会导致图像质量下降,尤其是边缘和细节丢失。
- #include <iostream>
- #include "opencv2/core.hpp"
- #include <opencv2/imgcodecs.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/core/mat.hpp>
- #include <opencv2/imgproc.hpp>
-
- using namespace std;
- using namespace cv;
-
- int main(){
- Mat image;
- image = imread("firefox.png"); //imread()读取图片
- if(!image.empty()){
- namedWindow("image", cv::WINDOW_NORMAL);
- imshow("image",image); //imshow展示图片,前面为展示名,后面为图片。
- resizeWindow("image", 640, 480);
- waitKey(0);
- }
- // destroyAllWindows();
-
- Mat resize_image;
- resize(image, resize_image, Size(), 1, 0.5); //resize()改变大小 前为高度 后为宽度
-
- if(!resize_image.empty()){
- namedWindow("resize", cv::WINDOW_NORMAL);
- imshow("resize",resize_image);
- resizeWindow("resize", 640, 480);
- waitKey(0);
- }
- imwrite("resize.png",resize_image); //imwrite(文件名,图片)写入文件 需要指定扩展名,否则exception
- // destroyAllWindows();
-
- Mat rotated_image;
-
- double angle = 90; //旋转角度
- Point2f center(image.cols / 2.0, image.rows / 2.0); //获取旋转中心
- Mat rotation_matix = getRotationMatrix2D(center, angle, 0.5); //getRotationMatrix2D()计算旋转矩阵 参数:旋转中心、旋转角度、放大倍数
- warpAffine(image, rotated_image, rotation_matix, image.size()); //warpAffine旋转图片 参数:原图、目标图片、旋转矩阵、生成图片的大小
-
-
- if(!rotated_image.empty()){
- namedWindow("rotate", cv::WINDOW_NORMAL);
- imshow("rotate",rotated_image);
- resizeWindow("rotate", 640, 480);
- waitKey(0);
- }
- imwrite("rotate.png",rotated_image);
- // destroyAllWindows();
-
-
- Mat translated_image;
- float tx = float(image.rows) / 4; //平移距离 1/4
- float ty = float(image.cols) / 4; //平移距离 1/4
- float warp_values[] = { 1.0, 0.0, tx, 0.0, 1.0, ty }; //构建平移矩阵
- Mat translation_matrix = Mat(2, 3, CV_32F, warp_values); //构建平移矩阵
- warpAffine(image, translated_image, translation_matrix, image.size()); //warpAffine平移图片
-
-
- if(!translated_image.empty()){
- namedWindow("translated", cv::WINDOW_NORMAL);
- imshow("translated",translated_image);
- resizeWindow("translated", 640, 480);
- waitKey(0);
- }
- imwrite("translated.png",translated_image);
- destroyAllWindows();
-
- Mat flipped_image_row;
- Mat flipped_image_col;
-
- flip(image, flipped_image_row, 1); //水平翻转
- flip(image, flipped_image_col, 0); //垂直翻转
-
- imshow("row",flipped_image_row);
- imshow("col",flipped_image_col);
- imshow("image",image);
- waitKey(0);
- destroyAllWindows();
-
- Mat blurred_image;
- GaussianBlur(image, blurred_image, cv::Size(99,99), 0);
- imshow("blurred_image",blurred_image);
- waitKey(0);
- destroyAllWindows();
- return 0;
- }
简单四宫格:
- #include <opencv2/core/mat.hpp>
- #include <opencv2/imgcodecs.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/imgproc.hpp>
-
- using namespace cv;
-
- int main(){
- Mat image = imread("firefox.png");
- // Mat image_45;
- Mat image_90;
- Mat image_180;
- Mat image_270;
-
- // double angle_45 = 45;
- double angle_90 = 90;
- double angle_180 = 180;
- double angle_270 = 270;
-
- Point2f center(image.cols / 2.0, image.rows / 2.0);
- // Mat rotation_matix_45 = getRotationMatrix2D(center, angle_45, 1.0);
- // warpAffine(image, image_45, rotation_matix_45, image.size());
-
- Mat rotation_matix_90 = getRotationMatrix2D(center, angle_90, 1.0);
- warpAffine(image, image_90, rotation_matix_90, image.size());
-
- Mat rotation_matix_180 = getRotationMatrix2D(center, angle_180, 1.0);
- warpAffine(image, image_180, rotation_matix_180, image.size());
-
- Mat rotation_matix_270 = getRotationMatrix2D(center, angle_270, 1.0);
- warpAffine(image, image_270, rotation_matix_270, image.size());
-
- Mat row_1;
- Mat row_2;
- Mat image_4x4;
- hconcat(std::vector<cv::Mat>{image, image_90},row_1); //横向拼接
- hconcat(std::vector<cv::Mat>{image_270, image_180},row_2); //纵向拼接
- vconcat(std::vector<cv::Mat>{row_1, row_2},image_4x4);
- imshow("4x4",image_4x4);
- waitKey(0);
- destroyAllWindows();
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。