Day1

发布时间 2023-04-13 23:06:08作者: ShadowAA

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;
			}
		}
	}