opencv学习笔记(一)

本文是OpenCV学习笔记的第一部分,重点介绍了Mat对象的构造和使用,包括IPImage对象的弃用原因。讲解了Mat的多种构造函数,并通过案例展示了如何创建和初始化Mat对象。此外,还探讨了Mat的一些基本属性如clone、copyTo、ptr、channels、cols和rows的用途。最后,文章提及使用腌模进行图像增强处理的方法。
摘要由CSDN通过智能技术生成
1.Mat 对象和IPImage 对象

IPImage 内部存在内存泄漏问题,因此一般不用此对象

mat类常用的构造函数:
Mat::Mat()
Mat::Mat(int rows, int cols, int type)
Mat::Mat(Size size, int type)
Mat::Mat(int rows, int cols, int type, const Scalar& s)
Mat::Mat(Size size, int type, const Scalar& s)
Mat::Mat(const Mat& m)
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)

补充使用方法:

M4 = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

Mat M8 = Mat::zeros(src.size(), src.type());

案例说明:

	Mat M(100, 100, CV_8UC1, Scalar(127));
	cout << "M=" << M << endl;

	Mat M2(10, 10, CV_8UC3, Scalar(0, 0, 255));
	cout << "M1=" << M2 << endl;

	Mat M3;
	M3.create(src.size(), src.type());
	M3 = Scalar(0, 255, 0);

	Mat M4;
	M4 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

	Mat M5 = Mat::eye(src.size(), src.type());
	Mat M6 = Mat::eye(2, 2, src.type());
	Mat M7 = Mat::eye(3, 3, CV_8UC3);
	Mat M8 = Mat::zeros(src.size(), src.type());
	Mat M9 = Mat::zeros(2, 2, CV_8UC2);

其中scalar的使用为进行通道赋值

2.常用简单方法属性:

clone copyto ptr channels cols rows

	Mat dst;
	src.copyTo(dst);
	printf("the first row pixel value is %d\n ", dst.ptr<char>(0));
	printf(" rows : %d\n", dst.rows);
	printf(" cols : %d\n", dst.cols);
	printf("channels of dst:%d\n", dst.channels());
3.使用腌模进行图像的增强处理
#include "pch.h"
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/opencv.hpp>  
#include<iostream>
#include<math.h>

using namespace std;
using namespace cv;
 
int main()
{
	Mat src,dst;
	src = imread("./test.png");
	if (!src.data)
	{
		printf("There is no photo!\n");
		return -1;
	}
	namedWindow("input_image", CV_WINDOW_AUTOSIZE);
	imshow("input_image", src);

//使用指针读取对应行指针
/***
   image.ptr<uchar>(row)[col] ;第row行第col列像素的指针 ptr point row
   saturate_cast<uchar>(int) 饱和去除 防止超过 0-255
****/
	int cols = (src.cols-1) * src.channels();
	int offsetx = src.channels();
	int rows = src.rows;

	dst = Mat::zeros(src.size(), src.type());

	for (int row = 1; row < (rows - 1); row++) {
		const uchar* previous = src.ptr<uchar>(row - 1);
		const uchar* current = src.ptr<uchar>(row);
		const uchar* next = src.ptr<uchar>(row + 1);
		uchar* output = dst.ptr<uchar>(row);
		for (int col = offsetx; col < cols; col++) {
			output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + previous[col] + next[col]));
		}
	}

//使用腌模方式
	double t = getTickCount(); //获取操作系统开始到现在经过的操作数 用于计时,也可用clock_t代替
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//常见的初始化核函数的方法
	filter2D(src, dst, src.depth(), kernel);
	double timeconsume = (getTickCount() - t) / getTickFrequency();
	printf("time consume %.2f\n", timeconsume);

	namedWindow("output_image", CV_WINDOW_AUTOSIZE);
	imshow("output_image", dst);
	waitKey(0);
	return 0;

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值