第一节课:显示一张图片
第一节课主要在于环境的配置和编译器的配置 VS2017 + opencv4
主要用到了函数 imread()、imshow()
//第一节课 加载一张图片
//IMREAD_GRAYSCALE 灰色
Mat src = imread("H:/image/1.jpg",IMREAD_GRAYSCALE);
//可以任意改变窗口大小
namedWindow("输入窗口", WINDOW_FREERATIO);
imshow("输入窗口", src);
//阻塞
waitKey(0);
destroyAllWindows();
第二节课 图像色彩空间转换
主要将图像转换为灰度图片、HSV图片 ———运用cvtColor()函数
以及图片的保存 imwrite()函数
//第二节课 转换图片为 HSV, 灰度、 保存图片
//按顺序来是 B G R 范围是 0-255
void QuickDemo::colorSpace_Demo(Mat &image) {
Mat gray, hsv;
//HSV
//H 0 - 180 S V 0 - 255
//H S 决定颜色 V决定亮度
cvtColor(image, hsv, COLOR_BGR2HSV);
//灰度
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("灰度", gray);
//保存
imwrite("H:/image/灰度.jpg", hsv);
}
第三节课 图像对象的创建和赋值
主要讲述了克隆、创建空白图像;单通道、三通道;还有如何获取图像的长、宽、通道
以及直接赋值只是一个指针指向它 一个改变都会改变
//第三节课
void QuickDemo::mat_creation_demo(Mat& image) {
Mat m1, m2;
//克隆
m1 = image.clone();
image.copyTo(m2);
//创建空白图像
//单通道的 千万不能用成多通道的
//Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);
//unsigned char 后面数字代表几通道
Mat m3 = Mat::zeros(Size(512, 512), CV_8UC3);
cout << "width:" << m3.cols << " height:" << m3.rows << " channels:" << m3.channels() << endl;
//赋值
m3 = Scalar(255, 0, 0);
//cout << m3 << endl;
imshow("m3", m3);
//只是一个指针指向它 一个改变都会改变 可以用clone产生一个新的
Mat m4 = m3;
m4 = Scalar(0, 255, 0);
imshow("m3", m3);
}
第四节课 图像像素的读写操作
综合第三节课,对图像进行遍历即可
//第四节课 图像读写操作
void QuickDemo::pixel_visit_demo(Mat &image) {
int w = image.cols;
int h = image.rows;
int dims = image.channels();
//注释为指针版本
for (int row = 0; row < h; row++) {
//uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++) {
if (dims == 1) { //单通道
//int pv = *current_row;
//*current_row++ = 255 - pv
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - pv;
}
if (dims == 3) { //彩色图像
//取反色
Vec3b bgr = image.at<Vec3b>(row, col);
image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
}
}
}
imshow("图像读写演示", image);
}
第五节课 图像的运算操作
利用重载过的运算符或者内置函数对图像进行加减乘除操作
//第五节课 图像色素算数操作
void QuickDemo::operator_demo(Mat &image) {
imshow("原图",image);
Mat dst;
//每个像素点加50 会改变亮度 + - * / 都可以
// 对应add(), substrace(), divide()
//multiply(image, m, dst); 乘法操作 调函数操作 dst = image * m
dst = image + Scalar(50, 50, 50);
imshow("加法操作", dst);
}
第六、七节课 滚动条操作
利用createTrackbar() 设置一个进度条,对图片进行亮度事实改变
Mat src, dst, m;
int lightness = 50;
static void on_track(int, void*) {
m = Scalar(lightness, lightness, lightness);
add(src, m, dst);
//addWeighted()
imshow("亮度调整后", dst);
}
void QuickDemo::tracking_bar_demo(Mat &image) {
namedWindow("亮度调整", WINDOW_AUTOSIZE);
dst = Mat::zeros(image.size(), image.type());
m = Mat::zeros(image.size(), image.type());
src = image;
int max_value = 100;
createTrackbar("Value Bar", "亮度调整", &lightness, max_value, on_track);
on_track(50, 0);
}