opencv 学习笔记(十二) 第二周总结


//1.添加必要的头文件; 8:34
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	//2.创建一个Mat对象,并读入附件build.jpg至Mat对象; 8:35
	Mat img1;
	
	img1 = imread("build.jpg");
	
	imshow("原图", img1);
	
	//3.利用平均值法公式D = (R + G + B) / 3灰度化图像build.jpg,存储为build_gray.jpg并显示;8:39
	Mat img2;
	
	img2.create(img1.size(), 0);
	
	for (int i = 0; i < img1.rows; i++)
	{
		for (int j = 0; j < img1.cols; j++)
		{
			img2.at<uchar>(i, j) = (img1.at<Vec3b>(i, j)[0] + img1.at<Vec3b>(i, j)[1] + img1.at<Vec3b>(i, j)[2]) / 3;
		}
	}
	imshow("灰度图", img2);
	
	imwrite("build_gray.jpg", img2);
	//4.按照公式y = 1.1x + 60,对图像build_gray.jpg进行线性灰度变换;8:43
	Mat img3;
	
	img3 = imread("build_gray.jpg",0);
	
	Mat img4;
	
	img4.create(img3.size(), 0);
	
	for (int i = 0; i < img3.rows; i++)
	{
		for (int j = 0; j < img3.cols; j++)
		{
			img4.at<uchar>(i, j) = 1.1*img3.at<uchar>(i, j) + 60;
		}
	}
	imshow("线性灰度变换", img4);
	
	//5.按照公式s = 1.2*log(1 + r),对图像build_gray.jpg进行非线性灰度变换;8:45
	Mat img5;
	
	img5.create(img3.size(), 0);
	for (int i = 0; i < img3.rows; i++)
	{
		for (int j = 0; j < img3.cols; j++)
		{
			img5.at<uchar>(i, j) = 1.2*log(1 + img3.at<uchar>(i, j));
		}
	}
	normalize(img5, img5, 0, 255, NORM_MINMAX);
	
	imshow("非线性灰度变换", img5);
	//6.计算图像build_gray.jpg灰度值等于100的像素值个数;
	int sum = 0;
	
	for (int i = 0; i < img3.rows; i++)
	{
		for (int j = 0; j < img3.cols; j++)
		{
			if (img3.at<uchar>(i, j) == 100);
			{
				sum++;
			}
		}
	}
	cout << "灰度值等于100的像素值个数" << sum << endl;
	
	//7.利用calcHist()函数得到build_gray.jpg灰度直方图并显示;
	int bins = 256;
	
	Mat hist;
	
	int hist_size[] = { bins };
	
	float range[] = { 0,256 };
	
	const float* ranges[] = { range };
	
	calcHist(&img3, 1, 0, Mat(), hist,1, hist_size, ranges);
	
	double max_l;
	
	minMaxLoc(hist, 0, &max_l);
	
	int s = 2;
	
	int gt = 256;
	
	Mat z = Mat::zeros(gt, s*bins, CV_8UC3);
	for (int i = 0; i < bins; i++)
	{
		float bin_val = hist.at<float>(i);
		
		int zg = cvRound(bin_val*gt / max_l);
		
		rectangle(z, Point(i*s, gt - 1), Point((i + 1)*s - 1, gt - zg), Scalar(255, 255, 255));
	}
	imshow("直方图", z);
	
	//8.使用函数equalizeHist实现图像build_gray.jpg灰度直方图均衡化并显示;
	Mat j(img3.size(), 0);

	equalizeHist(img3, j);

	imshow("直方图均衡化", j);
	//9.用blur函数对图像build.jpg进行滤波操作并显示;8:53
	Mat q;
	
	blur(img1, q, Size(3, 3));
	
	imshow("blur", q);
	
	//10.利用高斯滤波对图像build.jpg进行平滑并显示; 8:55
	Mat g;
	
	GaussianBlur(img1, g, Size(3, 3), 3, 3);
	
	imshow("高斯滤波", g);
	
	//11.用中值滤波对图像build.jpg进行平滑并显示滤波效果;8:56
	Mat m;
	
	medianBlur(img1, m, 3);
	
	imshow("中值滤波", m);
	
	//12.按公式对图像build.jpg进行平移,要求保全build.jpg全部像素; 9:03
	Mat pp;
	
	pp = imread("build.jpg");
	
	int x0 = 100;

	int y0 = 200;

	int r = pp.rows + y0;

	int c = pp.cols + x0;

	Mat p(r,c, pp.type());

	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			int x = j - x0;
			
			int y = i - y0;
			
			if (x >= 0 && y >= 0 && x < c&&y < r)
			{
				p.at<Vec3b> (i,j)= pp.ptr<Vec3b>(y)[x];
			}
		}
	}
	imshow("平移", p);
	
	//13.对图像build.jpg进行角度为30°的中心点旋转,不缩放,打印出旋转矩阵;9:05
	Point center(img1.cols / 2, img1.rows / 2);
	
	Mat o = getRotationMatrix2D(center, 30, 1);
	
	cout << "旋转矩阵" <<o<< endl;
	
	//14.实现图像build.jpg的上步规定旋转,并存储显示; 9:06
	Mat x;
	
	warpAffine(img1, x, o, x.size());
	
	imshow("旋转矩阵", x);
	
	//15.创建与图像build.jpg(源图像)大小相同的纯色图像(目标图像),颜色值为Scalar(100, 0, 150),并显示; 9:08
	
	Mat v(img1.size(), CV_8UC3, Scalar(100, 0, 150));
	
	imshow("创建", v);
	//16.在源图像和目标图像上自定义三对对应点,计算仿射变换;
	Point2f src[3];
	
	Point2f dst[3];

	src[0] = Point2f(0, 0);
	
	src[1] = Point2f(120, 200);
	
	src[2] = Point2f(130, 400);
	
	dst[0] = Point2f(0, 0);
	
	dst[1] = Point2f(220, 300);
	
	dst[2] = Point2f(230, 500);
	
	Mat r1 = getAffineTransform(src, dst);
	//17.实现上步的仿射变换,存储仿射变换后图像为“build.jpg仿射变换.jpg”并显示; 9:12
	warpAffine(img1, v, r1, v.size());
	
	imshow("仿射变换", v);
	
	imwrite("build.jpg仿射变换.jpg", v);
	
	//18.对“build.jpg仿射变换.jpg”添加宽度为10个像素边框修饰; 9:16
	Mat jj;
	
	jj = imread("build.jpg仿射变换.jpg");
	
	Mat bk;
	
	copyMakeBorder(jj, bk, 10, 10, 10, 10, 0, Scalar(255, 0, 0));
	
	imshow("边框", bk);
	//19.把图像build.jpg在x轴方向缩小1 / 2,在y轴方向缩小1 / 3并显示; 9:17
	Mat sx;
	
	resize(img1, sx, Size(img1.cols / 2, img1.rows / 2));
	
	imshow("缩小", sx);
	
	waitKey(0);
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,OpenCV是一个开源计算机视觉和机器学习软件库,用于开发图像和视频处理应用程序。通过使用OpenCV,您可以读取摄像头并显示实时图像,打开视频文件或摄像头文件,并获取视频的相关信息,例如帧宽度、帧高度、帧率和总帧数。 对于学习OpenCV,你可以按照以下步骤进行: 1. 安装OpenCV库:在开始学习OpenCV之前,您需要从OpenCV官方网站下载和安装OpenCV库。根据您的操作系统和编程语言选择合适的版本。 2. 学习基本概念:熟悉OpenCV的基本概念和术语,例如图像和视频的加载、显示、保存以及常用的图像处理操作,如滤波、边缘检测和特征提取等。 3. 掌握OpenCV函数和类:深入了解OpenCV提供的函数和类,例如cv::Mat用于图像和矩阵操作,cv::VideoCapture用于读取和处理视频,以及cv::imshow和cv::waitKey等用于显示图像的函数。 4. 实践项目:通过完成一些实践项目来应用您所学到的知识。例如,利用OpenCV实现人脸检测、目标追踪、图像识别等。 5. 学习资料和资源:查找和阅读OpenCV的官方文档、教程和示例代码,参与开源社区讨论和交流,加入相关的论坛和邮件列表等。 总结起来,学习OpenCV包括安装OpenCV库、学习基本概念、掌握OpenCV函数和类、实践项目以及查找和阅读相关资料和资源。通过不断实践和学习,您将能够更好地理解和应用OpenCV库来开发图像和视频处理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅念念52

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值