通道交换
问题描述:读取图像,然后将 RGB \text{RGB} RGB通道替换成 BGR \text{BGR} BGR通道。
代码如下(示例):
#include <opencv2/opencv.hpp>
// 通道交换
cv::Mat channel_swap(cv::Mat img)
{
int width = img.cols;
int height = img.rows;
cv::Mat new_image = cv::Mat::zeros(height, width, CV_8UC3);
for (int i = 0; i < height; ++i){
for (int j = 0; j < width; ++j){
// R -> B
new_image.at<cv::Vec3b>(i, j)[0] = img.at<cv::Vec3b>(i, j)[2];
new_image.at<cv::Vec3b>(i, j)[2] = img.at<cv::Vec3b>(i, j)[0];
new_image.at<cv::Vec3b>(i, j)[1] = img.at<cv::Vec3b>(i, j)[1];
}
}
return new_image;
}
int main()
{
// read image 在读取相对路径的图像时,要采用../, ./会报错
cv::Mat img = cv::imread("../Neopolitan.png", cv::IMREAD_COLOR);
// cv::Mat img = cv::imread("../Neopolitan.png", cv::IMREAD_GRAYSCALE);
// cv::Mat img = cv::imread("../Neopolitan.png", cv::IMREAD_UNCHANGED);
// cv::imshow("Neopolitan", img);
cv::Mat new_image = channel_swap(img);
cv::imwrite("../1-10/Neopolitan1.png", new_image);
cv::imshow("Neopolitan", new_image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
输入图像 (Neopolitan.png) | 输出图像 (Neopolitan1.png) |
---|---|
读取图像
cv::imread()
函数用于读取图像。针对函数的第二个参数,通过以下几个例子分别说明各自功能。
- cv::IMREAD_COLOR:默认参数,以彩色模式加载图像,图像的透明度将被忽略。
- cv::IMREAD_GRAYSCALE:以灰度模式加载图像。
- cv::IMREAD_UNCHANGED:以alpha通道模式加载图像。
显示图像
cv::imshow()
函数被用于在窗口中显示图像,窗口会自动适应图像大小。 其中,函数的第一个参数是窗口的名称,是字符串类型。第二个参数是要加载的图像。你可以显示多个图像窗口,但是每个窗口名称必须不同。
保存图像
cv::imwrite()
函数用于保存图像。其中第一个参数是保存为的图片名,第二个参数为待保存图像。
cv::waitKey()
是一个键盘事件函数,它的参数以毫秒为单位,该函数在毫秒的时间内去等待键盘事件,如果时间之内有键盘事件触发则程序继续,如果函数参数设置为0,则无限时间的等待键盘事件触发。它也可以设置为检测指定按键的触发,比如等待按键a的触发,我们将在下面讨论。
注意:这个函数除了可以等待键盘事件的触发之外还可以处理很多其他的GUI事件,所以你必须把它放在显示图像函数之后。
cv::destroyAllWindow()
函数用于关闭我们所创建的所有显示图像的窗口,如果想要关闭特定的窗口,请使用cv.destroyWindow()函数,把要关闭的窗口名称作为参数。