文章目录
知识来源:哔哩哔哩。以下内容仅为学习笔记,不做其他用途。
续前节OpenCV(C++版本)基础相关(2):图像的读取与显示、颜色空间转换、创建和赋值、像素的读写操作、像素的算术操作
六、滚动条操作
知识点:
createTrackbar
(“Value Bar:”, “亮度调整”, &lightness, max_value,on_track);//调用函数。
6.1 quickopencv.h
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void tracking_bar_demo(Mat &imge);
};
6.2 QuickDemo.cpp
#include<quickopencv.h>
#include<iostream>
Mat src, dst, m;//定义变量
int lightness = 50;//初始化亮度50
static void on_track(int, void *)
{
m = Scalar(lightness, lightness, lightness);
add(src, m, dst); //定义亮度变化为加
//subtract(src, m, dst);//定义亮度变化为减
imshow("亮度调整", dst);//显示调整亮度之后的图片
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
namedWindow("亮度调整", WINDOW_KEEPRATIO);
resizeWindow("亮度调整", 320, 480);
dst = Mat::zeros(image.size(),image.type());
m = Mat::zeros(image.size(), image.type());
src = image;
int max_value = 100;//定义最大亮度为100
createTrackbar("Value Bar", "亮度调整", &lightness, max_value, on_track);//调用函数。
on_track(50, 0);
}
6.3 test.cpp
#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.tracking_bar_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
七、滚动条-传递参数
知识点:
-
addWeighted
(const CvArr*src1
, doublealpha
,const CvArr*src2
, doublebeta
,doublegamma
, CvArr*dst
)函数是将两张相同大小,相同类型的图片融合的函数。参数1:src1,第一张图.
参数2:alpha,第一张图alpha
参数3:src2 第二张图
参数4:beta,第二张图alpha
参数5:gamma,图1与图2作和后添加的数值
参数6:dst,输出图片dst = src1[i] * alpha + src2 * beta + gamma;
7.1 quickopencv.h
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void tracking_bar_demo(Mat &imge);
};
7.2 QuickDemo.cpp
#include<quickopencv.h>
#include<iostream>
static void on_lightness(int b, void * userdata)
{
Mat image = *((Mat*)userdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(b, b, b);
addWeighted(image, 1.0, m, 0, b, dst);//融合两张图
imshow("亮度和对比度调整", dst);//显示调整之后的图片
}
static void on_contrast(int b, void * userdata)
{
Mat image = *((Mat*)userdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
double contrast = b / 100.0;
m = Scalar(b, b, b);
addWeighted(image, contrast, m, 0.0, 0, dst);//融合两张图
imshow("亮度和对比度调整", dst);//显示调整之后的图片
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
namedWindow("亮度和对比度调整", WINDOW_KEEPRATIO);
resizeWindow("亮度和对比度调整", 320, 480);
int lightness = 50;
int max_value = 100;//定义最大亮度为100
int contrast_value = 100;
createTrackbar("Value Bar", "亮度和对比度调整", &lightness, max_value, on_lightness, (void*)(&image));
createTrackbar("Constrast Bar", "亮度和对比度调整", &contrast_value, 200, on_contrast, (void*)(&image));
on_lightness(50, &image);
}
7.3 test.cpp
#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.tracking_bar_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
八、键盘响应操作
知识点:
- char c =
waitKey
(100);//等待100ms - if (c == 27)
{
break; //退出
}//利用不同的按键输入,得到不一样的结果。
8.1 quickopencv.h
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void key_demo(Mat &imge);
};
8.2 QuickDemo.cpp
#include<quickopencv.h>
#include<iostream>
void QuickDemo::key_demo(Mat &image)
{
Mat dst = Mat::zeros(image.size(), image.type());
while (true)
{
char c = waitKey(100);//等待100ms
if (c == 27) { //退出
break;
}
if (c == 49)//key#1
{
std::cout << "you print key #1" << std::endl;
cvtColor(image, dst, COLOR_BGR2GRAY);
}
if (c == 50)//key#2
{
std::cout << "you print key #2" << std::endl;
cvtColor(image, dst, COLOR_BGR2HSV);
}
if (c == 51)//key#3
{
std::cout << "you enter key #3" << std::endl;
dst = Scalar(50, 50, 50);
add(image, dst, dst);
}
namedWindow("键盘响应", WINDOW_KEEPRATIO);
imshow("键盘响应", dst);
resizeWindow("键盘响应", 320, 480);
std::cout << c << std::endl;
}
}
8.3 test.cpp
#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.key_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
九、自带颜色操作
知识点:
applyColorMap
(image, dst, colormap[index % 19]);//循环展示19种图片。
9.1 quickopencv.h
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void color_style_demo(Mat &imge);
};
9.2 QuickDemo.cpp
#include<quickopencv.h>
#include<iostream>
void QuickDemo::color_style_demo(Mat &image)
{
int colormap[] = {
COLORMAP_AUTUMN ,
COLORMAP_BONE,
COLORMAP_CIVIDIS,
COLORMAP_DEEPGREEN,
COLORMAP_HOT,
COLORMAP_HSV,
COLORMAP_INFERNO,
COLORMAP_JET,
COLORMAP_MAGMA,
COLORMAP_OCEAN,
COLORMAP_PINK,
COLORMAP_PARULA,
COLORMAP_RAINBOW,
COLORMAP_SPRING,
COLORMAP_TWILIGHT,
COLORMAP_TURBO,
COLORMAP_TWILIGHT,
COLORMAP_VIRIDIS,
COLORMAP_TWILIGHT_SHIFTED,
COLORMAP_WINTER
};
Mat dst;
int index = 0;
while (true)
{
char c = waitKey(2000);//停顿2000ms,可以改变等待时间,来改变播放速度
if (c == 27) { //esc 退出
break;
}
if (c == 49)//按下按键数字键1时,保存图片到指定位置
{
std::cout << "you enter key #1" << std::endl;
imwrite("D:/opencv/pictures/gray.jpg", dst);
}
applyColorMap(image, dst, colormap[index % 19]);//“%19”取模后,就能循环展示19种图片
index++;
namedWindow("颜色风格", WINDOW_KEEPRATIO);
imshow("颜色风格", dst); //在窗口显示图像
resizeWindow("颜色风格", 320, 480);
}
}
9.3 test.cpp
#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.color_style_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}
十、图像像素的逻辑操作
知识点:
rectangle
(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);//矩形坐标(100,100),大小80 * 80;颜色(255, 255, 0);小于0表示填充,大于0表示绘制;lineType:LINE_8;
10.1 quickopencv.h
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo //QuickDemo对象
{
public:
void bitwise_demo(Mat &imge);
};
10.2 QuickDemo.cpp
#include<quickopencv.h>
#include<iostream>
void QuickDemo::bitwise_demo(Mat &image)
{
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);//两个大小类型完全一致
rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);//矩形坐标(100,100),大小80 * 80;颜色(255, 255, 0);小于0表示填充,大于0表示绘制;lineType:LINE_8;
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);//矩形坐标(150,150),大小80 * 80;颜色(0, 255, 255);小于0表示填充,大于0表示绘制;lineType:LINE_8;
imshow("m1", m1);
imshow("m2", m2);
Mat dst;
//bitwise_and(m1, m2, dst);//位操作“与”
//bitwise_or(m1, m2, dst);//位操作“或”
//bitwise_xor(m1, m2, dst);//位操作“异或”
bitwise_not(image, dst);//位操作“非”
namedWindow("像素位操作", WINDOW_KEEPRATIO);
imshow("像素位操作", dst); //在窗口显示图像
resizeWindow("像素位操作", 320, 480);
}
10.3 test.cpp
#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
if (src.empty())
{
printf("could not load image"); //如果路径不正确,则显示无法导入图片。
return -1;
}
namedWindow("输入窗口", WINDOW_KEEPRATIO);
imshow("输入窗口", src); //在窗口显示图像
resizeWindow("输入窗口", 320, 480);
QuickDemo qd; //调用之前创建的类对象
qd.bitwise_demo(src);
waitKey(0); //暂停程序,等待一个按键输入,单位ms
destroyAllWindows(); //销毁所有创建的窗口
return 0;
}