目录
用OpenCV做一些简单的操作
1. 图像读取与显示
imread(读入图片信息)
imshow(显示图片)
2. 图像色彩空间转换
色彩空间转换函数--cvtColor
图像保存--imwrite
3. 图像对象的创建与赋值
4. 图像像素的读写操作
5. 图像像素的算数操作
6. 图像亮度调整
用OpenCV做一些简单的操作
1. 图像读取与显示
imread(读入图片信息)
imshow(显示图片)
注:imshow()只能支持八位的输入
Mat src = imread("jennie.jpg",IMREAD_GRAYSCALE);
得到的是一张灰度图
Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
保留原本的透明通道
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("jennie.jpg"); // 读入的RGB顺序是BGR
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
imshow("输出窗口", src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
2. 图像色彩空间转换
色彩空间转换函数--cvtColor
COLOR_BGR2GRAY = 6? 彩色到灰度
COLOR_GRAY2BGR = 8 灰度到彩色
COLOR_BGR2HSV = 40 BGR到HSV
COLOR_HSV2BGR = 54? HSV 到BGR
图像保存--imwrite
第一个参数是图像保存路径
第二个参数是图像内存对象
BGR通道,B,G,R,三个通道都是0~255
HSV 通道,H通道0~180,S,V通道是0~255(H和S通道表示颜色,V通道表示亮度)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class demo
{
public:
void colorSpace_Demo(Mat& image)
{
Mat gray, hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("灰度", gray);
imwrite("hsv.png", hsv);
imwrite("gray.png", gray);
}
};
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.colorSpace_Demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
3. 图像对象的创建与赋值
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class demo
{
public:
void mat_creation_demo(Mat& image)
{
Mat m1, m2;
m1 = image.clone();
image.copyTo(m2);
// 创建空白图像
Mat m3 = Mat::zeros(Size(400, 400), CV_8UC3);
// 8位无符号字符1个通道的数据,改成3之后在表示像素点的时候的像素值都有三个,表示有三个通道
m3 = 127;// 只赋值一个值的时候默认是第一个通道
m3 = Scalar(127, 12, 260);// 当确定了通道数量后可以给每个通道赋值
cout << "width:" << m3.cols << "\t height:" << m3.rows << "\tchannels:(通道)" << m3.channels() << endl;
cout << m3 << endl;
imshow("自定义图像", m3);
Mat m4 = m3;
m4 = Scalar(260, 12, 127);
imshow("自定义图像", m3);
// m4是与m3指向同一片地址,改变m4同时会改变m3
imshow("自定义图像4", m4);
/*
如果是
Mat m4 = m3.clone();//克隆
m3.copyTo(m4);// 复制
会重新创建一个图像,并不是指向同一地址
类似于深拷贝与浅拷贝的问题
*/
}
};
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.mat_creation_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
4. 图像像素的读写操作
C++中的像素遍历与访问
Python中的像素遍历与访问
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class demo
{
public:
void pixel_visit_demo(Mat &image)
{
int width = image.cols;
int height = image.rows;
int dims = image.channels();
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (dims == 1) {// 灰度图像
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];
}
}
}
// 指针
/*
for (int row = 0; row < height; row++) {
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < width; col++) {
if (dims == 1) {// 灰度图像
int pv = *current_row;
*current_row++ = 255 - pv;
}
if (dims == 3) {// 彩色图像
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
*/
imshow("像素读写演示", 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.pixel_visit_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
5. 图像像素的算数操作
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class demo
{
public:
void operatos_demo(Mat& image)
{
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(50, 50, 50);
add(image, m, dst);
imshow("加法操作", dst);
subtract(image, m, dst);
imshow("减法操作", dst);
multiply(image, m, dst);
imshow("乘法操作", dst);
divide(image, m, 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.operatos_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
6. 图像亮度调整
这边有问题的朋友要学习一下回调函数。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class demo
{
public:
static void on_track(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);
add(image, m, dst);
imshow("亮度调整", dst);
}
void tracking_bar_demo(Mat &image)
{
namedWindow("亮度调整", WINDOW_AUTOSIZE);
int max_value = 100;
int lightness = 50;
createTrackbar("Value Bar:", "亮度调整", &lightness, max_value, on_track,(void*)(&image));
on_track(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;
}
|