OpenCV: 图片显示及图片颜色空间转换
在C++中使用OpenCV进行图片显示和颜色空间转换时,你可能会用到以下一些常用函数:
- 图片加载和保存函数:
cv::imread
:加载图片文件。
cv::imwrite
:保存图片到文件。
- 图片显示函数:
cv::imshow
:在窗口中显示图像。
cv::namedWindow
:创建一个具有给定名称的窗口。
cv::destroyWindow
:关闭指定名称的窗口。
- 颜色空间转换函数:
cv::cvtColor
:执行颜色空间转换。
1、Mat
cv::Mat
是OpenCV中用于表示图像和矩阵的主要数据结构之一。它是一个多维数组,用于存储图像的像素值和进行图像处理操作。
cv::Mat
的构造函数有多种形式,常用的有:
cv::Mat()
默认构造函数,创建一个空的 cv::Mat
对象。
cv::Mat(int rows, int cols, int type)
创建一个指定行数、列数和像素类型的 cv::Mat
对象。例如,cv::Mat image(480, 640, CV_8UC3)
创建一个大小为 480x640 的 3 通道彩色图像。
cv::Mat(int rows, int cols, int type, const Scalar& s)
创建一个指定行数、列数、像素类型和初始值的 cv::Mat
对象。Scalar
是一个用于表示多通道像素值的类。例如,cv::Mat image(480, 640, CV_8UC3, cv::Scalar(0, 0, 255))
创建一个大小为 480x640 的 3 通道彩色图像,并将所有像素的初始值设置为红色(BGR:0, 0, 255)。
cv::Mat(const Mat& m)
拷贝构造函数,用于创建一个与给定 cv::Mat
对象相同的副本。
cv::Mat
对象可以通过访问其成员函数和数据成员来进行操作和访问图像数据。一些常用的操作和成员函数包括:
rows()
和 cols()
:返回图像的行数和列数。
size()
:返回图像的大小(行数和列数)。
channels()
:返回图像的通道数。
depth()
:返回图像的深度,即每个像素值的数据类型。
empty()
:检查图像是否为空(即没有分配内存)。
clone()
:创建并返回一个与原始图像数据相同的副本。
at()
:用于访问图像中的像素值。
除了用于表示图像,cv::Mat
还可以用于存储和处理其他类型的矩阵数据。它提供了丰富的函数和操作符,用于对矩阵进行数学运算、线性代数操作、图像处理等。
2、imread()
cv::imread
是OpenCV中用于加载图像文件的函数。它的完整函数签名如下:
cv::Mat cv::imread(const std::string& filename, int flags);
函数参数说明如下:
filename
:图像文件的路径和名称。
flags
:可选参数,用于指定读取图像的方式。可以是以下标志之一:
cv::IMREAD_COLOR
(默认):加载图像并将其转换为BGR颜色空间(三通道彩色图像)。
cv::IMREAD_GRAYSCALE
:以灰度模式加载图像(单通道灰度图像)。
cv::IMREAD_UNCHANGED
:加载图像,并保留其原始通道数和深度。
函数返回一个 cv::Mat
对象,即图像的矩阵表示。
3、imwrite()
cv::imwrite
是OpenCV中用于将图像保存为文件的函数。它的完整函数签名如下:
bool cv::imwrite(const std::string& filename, const cv::Mat& image, const std::vector<int>& params = std::vector<int>());
函数参数说明如下:
filename
:保存图像的路径和名称。
image
:要保存的图像,以 cv::Mat
对象表示。
params
:可选参数,用于指定保存图像的方式。可以是保存图像质量、压缩格式等参数的设置。具体的参数取决于图像保存的文件格式。
函数返回一个布尔值,表示图像是否成功保存到文件中。
4、imshow
cv::imshow
是OpenCV中用于在窗口中显示图像的函数。它的完整函数签名如下:
void cv::imshow(const std::string& winname, const cv::Mat& image);
函数参数说明如下:
winname
:窗口的名称,用于标识显示图像的窗口。
image
:要显示的图像,以 cv::Mat
对象表示。
cv::imshow
函数将图像显示在具有给定名称的窗口中。如果窗口不存在,则会创建一个新窗口。如果窗口已存在,则会更新窗口中显示的图像。
5、namedWindow
cv::namedWindow
是OpenCV中用于创建一个具有指定名称的窗口的函数。它的完整函数签名如下:
void cv::namedWindow(const std::string& winname, int flags = cv::WINDOW_AUTOSIZE);
函数参数说明如下:
winname
:窗口的名称,用于标识窗口。
flags
:可选参数,用于指定窗口的标志。可以是以下标志之一:
cv::WINDOW_NORMAL
:窗口大小可以调整。
cv::WINDOW_AUTOSIZE(默认)
:窗口大小根据图像大小自动调整。
cv::namedWindow
函数用于创建一个具有指定名称的窗口,以便在该窗口中显示图像或进行其他用户界面操作。如果窗口名称已存在,则此函数不执行任何操作。
6、destroyWindow
cv::destroyWindow
是 OpenCV 中用于关闭指定名称的窗口的函数。它的函数签名如下:
void cv::destroyWindow(const std::string& winname);
函数参数说明如下:
winname
:要关闭的窗口的名称。
cv::destroyWindow
函数用于关闭具有指定名称的窗口。如果窗口不存在或已经关闭,该函数不执行任何操作。
7、cvtColor()
cv::cvtColor
是 OpenCV 中用于图像颜色空间转换的函数。它可以将一个图像从一种颜色表示方式转换为另一种颜色表示方式。常见的颜色空间转换包括灰度化、RGB 到 HSV 的转换等。
cv::cvtColor
的函数签名如下:
void cv::cvtColor(const cv::Mat& src, cv::Mat& dst, int code, int dstCn = 0);
函数参数说明如下:
src
:输入图像,以 cv::Mat 对象表示。
dst
:输出图像,以 cv::Mat 对象表示。
code
:颜色转换代码,用于指定所需的颜色转换类型。可以是 cv::ColorConversionCodes 中定义的常量之一。
dstCn
:可选参数,输出图像的通道数。默认值为 0,表示与输入图像的通道数相同。
cv::cvtColor
函数将输入图像 src
转换为指定的颜色空间,并将结果存储在输出图像 dst
中。输出图像的大小和类型与输入图像相同,除非指定了不同的通道数。
常用的颜色空间转换代码:
cv::COLOR_BGR2GRAY
:BGR 到灰度图像的转换。
cv::COLOR_GRAY2BGR
:灰度图像到BGR 的转换。
cv::COLOR_BGR2RGB
:BGR 到 RGB 的转换。
cv::COLOR_RGB2BGR
:RGB 到 BGR 的转换。
cv::COLOR_BGR2HSV
:BGR 到 HSV 的转换。
cv::COLOR_HSV2BGR
:HSV 到 BGR 的转换。
cv::COLOR_BGR2Lab
:BGR 到 Lab 的转换。
cv::COLOR_Lab2BGR
:Lab 到 BGR 的转换。
cv::COLOR_BGR2YCrCb
:BGR 到 YCrCb 的转换。
cv::COLOR_YCrCb2BGR
:YCrCb 到 BGR 的转换。
8、OpenCV颜色空间转换实践
首先,定义一个cvtcolor_test.h作为颜色空间转换类的头文件:
8.1 cvtcolor_test.h文件
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <memory>
using namespace cv;
class CCvtColorTest
{
public:
void colorSpaceDemo(Mat& img);
};
using CCvtColorTestPtr = std::shared_ptr<CCvtColorTest>;
然后,在cvtcolor_test.cpp文件中实现具体的颜色空间转换逻辑:
8.2 cvtcolor_test.cpp文件
#include "cvtcolor_test.h"
void CCvtColorTest::colorSpaceDemo(Mat& img)
{
Mat gray_img, hsv_img, ycrcb_img, lab_img, luv_img;
cvtColor(img, hsv_img, COLOR_BGR2HSV);
cvtColor(img, gray_img, COLOR_BGR2GRAY);
cvtColor(img, ycrcb_img, COLOR_BGR2YCrCb);
cvtColor(img, lab_img, COLOR_BGR2Lab);
cvtColor(img, luv_img, COLOR_BGR2Luv);
imshow("Hsv", hsv_img);
imshow("Gray", gray_img);
imshow("YCrcb", ycrcb_img);
imshow("Lab", lab_img);
imshow("Luv", luv_img);
imwrite("D:/PHOTO&VIDEO/image_test/test_img_hsv.png", hsv_img);
imwrite("D:/PHOTO&VIDEO/image_test/test_img_gray.png", gray_img);
imwrite("D:/PHOTO&VIDEO/image_test/test_img_ycrcb.png", ycrcb_img);
imwrite("D:/PHOTO&VIDEO/image_test/test_img_lab.png", lab_img);
imwrite("D:/PHOTO&VIDEO/image_test/test_img_luv.png", luv_img);
}
最后,在主函数中进行调用使用:
#include <iostream>
#include "cvtcolor_test.h"
using namespace std;
using namespace cv;
int main(int argc, char* argv)
{
Mat src = imread("D:/PHOTO&VIDEO/image_test/test_img.png", IMREAD_ANYCOLOR);
if (src.empty())
{
std::cout << "could not load image!" << std::endl;
return -1;
}
namedWindow("input windows: ", WINDOW_FREERATIO);
imshow("input windows: ", src);
CCvtColorTestPtr cvtcolor_test;
cvtcolor_test = std::make_shared<CCvtColorTest>();
cvtcolor_test->colorSpaceDemo(src);
waitKey(0);
destroyAllWindows();
return 0;
}
结果如图所示:
在以上颜色转换空间类中,我们使用 OpenCV 的 cvtColor
函数将输入图像 img
转换为不同的颜色空间。下面是每个转换的解释:
cvtColor(img, hsv_img, COLOR_BGR2HSV);
:将 BGR 彩色图像 img 转换为 HSV(色调、饱和度、亮度)颜色空间,并将结果保存在hsv_img
中。
cvtColor(img, gray_img, COLOR_BGR2GRAY);
:将 BGR 彩色图像 img 转换为灰度图像,并将结果保存在 gray_img 中。灰度图像只包含亮度信息,每个像素的值表示原始彩色图像中相应像素的亮度级别。
cvtColor(img, ycrcb_img, COLOR_BGR2YCrCb);
:将 BGR 彩色图像 img
转换为 YCrCb(亮度、红色差、蓝色差)颜色空间,并将结果保存在 ycrcb_img
中。YCrCb 颜色空间表示颜色的亮度和色度分量。
cvtColor(img, lab_img, COLOR_BGR2Lab);
:将 BGR 彩色图像 img
转换为 Lab(亮度、绿-红色度、蓝-黄色度)颜色空间,并将结果保存在 lab_img
中。Lab
颜色空间包含亮度信息和颜色信息。
cvtColor(img, luv_img, COLOR_BGR2Luv);
:将 BGR 彩色图像 img
转换为 Luv(亮度、色度)颜色空间,并将结果保存在 luv_img
中。Luv 颜色空间是一种设备无关的颜色空间,用于描述人类可见的所有颜色。
- 分享
- 举报
-
浏览量:4473次2021-01-27 15:15:35
-
浏览量:4935次2021-04-25 16:34:37
-
浏览量:1094次2023-07-05 10:11:08
-
浏览量:2882次2020-09-20 21:37:39
-
浏览量:9372次2020-12-18 22:21:10
-
浏览量:2345次2020-08-14 18:24:27
-
浏览量:5623次2020-12-21 16:50:21
-
浏览量:3495次2020-10-21 11:25:37
-
2020-10-21 11:35:55
-
浏览量:1086次2023-08-29 15:52:13
-
浏览量:7271次2020-12-21 20:12:30
-
浏览量:6067次2020-12-29 14:13:00
-
2023-06-02 17:41:55
-
浏览量:903次2023-08-04 10:55:54
-
浏览量:4754次2021-01-19 16:45:32
-
浏览量:5613次2021-01-02 22:50:35
-
浏览量:4953次2021-01-11 15:33:50
-
浏览量:6172次2020-12-25 23:18:24
-
浏览量:1439次2023-04-14 10:20:01
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
bonjour
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明