Opencv学习笔记
Day1
图像读取与显示
#include<bits/stdc++.h>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
Mat a = imread("E:/壁纸/5.jpg");
//创建一个Windows窗口
namedWindow("输入窗口", WINDOW_FREERATIO);
//显示图像
imshow("输入窗口", a);
//持续10000ms
waitKey(10000);
//关闭所有窗口
destroyAllWindows();
}
图像色彩空间转换
头文件
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo {
public:
void colorSpace_Demo(Mat &image);
};
源文件
#include<bits/stdc++.h>
#include<QuickDemo.h>
void QuickDemo::colorSpace_Demo(Mat& image)
{
Mat gray, hsv;
cvtColor(image, hsv, COLOR_BGR2HSV); //转换色彩空间
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("灰度", gray);
imwrite("E:/hsv.png", hsv);
imwrite("E:/gray.png", gray);
}
#include<bits/stdc++.h>
#include<opencv2/opencv.hpp>
#include<QuickDemo.h>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
Mat a = imread("E:/壁纸/5.jpg");
namedWindow("输入窗口", WINDOW_FREERATIO);
imshow("输入窗口", a);
QuickDemo qd;
qd.colorSpace_Demo(a);
waitKey(10000);
destroyAllWindows();
}
图像对象的创建与赋值
void QuickDemo::mat_creation_demo(Mat& image)
{
Mat m1, m2;
m1 = image.clone(); //克隆
image.copyTo(m2); //拷贝
//创建图像
//
//创建一个全是0的8*8的8位的ugsined无符号的单通道的图像
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
//输出m3图像
std::cout << m3 << std::endl;
//创建一个50*50 8位的ugsined无符号的三通道的图像 每三个数表示一个像素
Mat m4 = Mat::zeros(Size(50, 50), CV_8UC3);
//输出m4的宽度 高度 通道数
std::cout << "width:" << m4.cols << "height:" << m4.rows << "channels:" << m4.channels() << std::endl;
//创建一个全是1的图像 之能用于单通道
Mat m5 = Mat::ones(Size(8, 8), CV_8UC1);
std::cout << m5 << std::endl;
//第一通道全部赋值127
m5 = 127;
std::cout << m5 << std::endl;
//三个通道分别赋值255 0 0
m4 = Scalar(255, 0, 0);
std::cout << m4 << std::endl;
//显示图像
//imshow("创建图像", m4);
//改变m6颜色 m4颜色也改变
//说明m6指向m4
Mat m6 = m4;
m6 = Scalar(0, 255, 255);
imshow("创建图像", m4);
//克隆会产生一个独立的个体
//两者没有关系
Mat m7 = m4.clone();
m7 = Scalar(0, 255, 255);
imshow("图像1", m4);
imshow("图像2", m7);
//copyTo操作也会产生一个独立的个体
Mat m8;
m4.copyTo(m8); //将m4 copy给m8
m8 = Scalar(0, 255, 255);
imshow("图像3", m8);
}
图像像素的读写操作
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++)
{
for (int col = 0; col < w; col++)
{
if (dims == 1) //灰度图像
{
//将当前这个像素点的颜色变为255-pv;
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - pv;
}
if (dims == 3) //彩色图像
{
//获取该像素点的三个值rgb
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);
}
也可以使用指针 更简洁
//遍历每个像素点
for (int row = 0; row < h; row++)
{
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++)
{
if (dims == 1) //灰度图像
{
*current_row++ = 255 - *current_row;
}
if (dims == 3) //彩色图像
{
//不用麻烦的分三通道 指针会出手
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
标签:Mat,int,image,Day1,current,col,row
From: https://www.cnblogs.com/ShadowAA/p/17316897.html