目录
官方在线帮助文档:OpenCV: OpenCV modules
用OpenCV对图像做一些简单的操作
1. 亮度调整与对比度调整
2. 键盘响应操作
3. 自带颜色操作
4. 图像像素的逻辑操作
5. 通道分离与合并
6. 图像色彩空间转换
7. 图像像素值统计
8. 图像几何形状绘制
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
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());
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;
addWeighted(image, contrast, m, 0.0, 0, dst);
imshow("亮度与对比度调整", dst);
}
void tracking_bar_demo(Mat &image)
{
namedWindow("亮度与对比度调整", WINDOW_AUTOSIZE);
int max_value = 100;
int lightness = 50;
int contract_value = 100;
createTrackbar("Value Bar:", "亮度与对比度调整", &lightness, max_value, on_lightness,(void*)(&image));
createTrackbar("Contrast Bar:", "亮度与对比度调整", &contract_value, 200, on_contrast, (void*)(&image));
on_lightness(50, &image);
}
};
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.tracking_bar_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void key_demo(Mat& image)
{
Mat dst = Mat::zeros(image.size(), image.type());
while (true) {
int c = waitKey(100);
if (c == 27) {// 退出
break;
}
if (c == 49) {// Key #1
cout << "你按了1:要进行转换灰度的操作"<< endl;
cvtColor(image, dst, COLOR_BGR2GRAY);
}
if (c == 50) {// Key #2
cout << "你按了2:要进行转换HSV的操作" << endl;
cvtColor(image, dst, COLOR_BGR2HSV);
}
if (c == 51) {// Key #3
cout << "你按了3:要进行亮度的调节" << endl;
dst = Scalar(50, 50, 50);
add(image, dst, dst);
}
imshow("键盘响应", dst);
}
}
};
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.key_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
Look Up Table 查找表
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void color_style_demo(Mat &image)
{
int colormap[] = {
COLORMAP_AUTUMN,
COLORMAP_BONE,
COLORMAP_JET,
COLORMAP_WINTER,
COLORMAP_RAINBOW,
COLORMAP_OCEAN,
COLORMAP_SUMMER,
COLORMAP_SPRING,
COLORMAP_COOL,
COLORMAP_PINK,
COLORMAP_HOT,
COLORMAP_PARULA,
COLORMAP_MAGMA,
COLORMAP_INFERNO,
COLORMAP_PLASMA,
COLORMAP_VIRIDIS,
COLORMAP_CIVIDIS,
COLORMAP_TWILIGHT,
COLORMAP_TWILIGHT_SHIFTED
};
Mat dst;
int index = 0;
while (true) {
int c = waitKey(1000);
if (c == 27) {// 退出
break;
}
applyColorMap(image, dst, colormap[index%19]);
index++;
imshow("颜色风格", dst);
}
}
};
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.color_style_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void 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);
// -1 是填充,2是描边
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
imshow("m1", m1);
imshow("m2", m2);
Mat dst;
bitwise_and(m1, m2, dst);
imshow("像素与操作", dst);
bitwise_or(m1, m2, dst);
imshow("像素或操作", dst);
bitwise_not(image, dst);
// Mat dst = ~image;//取反
imshow("取反", dst);
bitwise_xor(m1, m2, dst);
imshow("异或", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.bitwise_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
#include
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void channels_demo(Mat& image)
{
// 通道分离
vector mv;
split(image, mv);
imshow("蓝色", mv[0]);
imshow("绿色", mv[1]);
imshow("红色", mv[2]);
Mat dst;
mv[1] = 0;
mv[2] = 0;
merge(mv, dst);
imshow("蓝色", dst);
// 同理修改其他两种通道后彰显一种通道的颜色
// 也可以只让其中一个通道的值为0
// 通道的合并
int from_to[] = { 0,2,1,1,2 };
mixChannels(&image, 1, &dst, 1, from_to, 3);
imshow("通道混合", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.channels_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
API知识点
#include
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void inrange_demo(Mat& image)
{
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask;
inRange(hsv, Scalar(0, 43, 46), Scalar(180, 255, 255), mask);
imshow("mask", mask);
Mat redback = Mat::zeros(Size(), image.type());
redback = Scalar(40, 40, 200);
bitwise_not(mask, mask);
imshow("mask", mask);
image.copyTo(redback, mask);
imshow("roi区域提取", redback);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.inrange_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
知识点:像素值统计
API知识点
#include
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void pixel_statistic_demo(Mat& image)
{
double minv, maxv;
Point minLoc, maxLoc;
vector mv;
split(image, mv);
for (int i = 0; i < mv.size(); i++)
{
minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
cout << "No.channels:" << i << "min value:" << minv << "max value:" << maxv << endl;
}
Mat mean, stddev;
meanStdDev(image, mean, stddev);
cout << "means:" << mean << endl;
cout<<"stddev:" << stddev << endl;
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.pixel_statistic_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
#include
#include
#include
using namespace cv;
using namespace std;
class demo
{
public:
void drawing_demo(Mat& image)
{
Rect rect;
rect.x = 300;
rect.y = 200;
rect.width = 100;
rect.height = 100;
rectangle(image, rect, Scalar(0, 0, 255), 2, 8, 0);
// 2,绘制. -1,填充
circle(image, Point(150, 250), 50, Scalar(255, 0, 0), 2, 8, 0);
line(image, Point(300, 200), Point(400, 300), 2, LINE_AA, 0);
// LINE_AA 边缘融合
RotatedRect rrt;
rrt.center = Point(150, 150);
rrt.size = Size(100, 200);
rrt.angle = 90.0;
ellipse(image, rrt, Scalar(0, 255, 255), 2, 8);
imshow("图像演示", image);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.drawing_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
这部分的内容是非常有趣的,但是我的建议是在学习这部分内容时,不仅要敲代码,更要结合官方的API文档辅助学习。
同时,关于文章内容有什么问题希望大家可以给予反馈,如果觉得还不错,可以点个关注。
谢谢大家,希望大家在快乐的编程中进步。