OpenCV知识点

一、Mat

  OpenCV中Mat的尺寸信息:高、宽、通道数、维度

float* Idata = new float[480 * 640 * 3];
Mat I(480, 640, CV_32FC3, Idata);

cout << "rows: " << I.rows << endl;             // 480
cout << "cols: " << I.cols << endl;             // 640
cout << "channels: " << I.channels() << endl;   // 3  C3=3通道
cout << "size: " << I.size << endl;             // 480x640
cout << "width: " << I.size().width << endl;    // 640
cout << "height: " << I.size().height << endl;  // 480
cout << "dims: " << I.dims << endl;             // 2  C1和C3 dims维度都是2  矩阵的维度
cout << "depth: " << I.depth() << endl;         // 5  与type有关  8U=0 8S=1 16U=2 16S=3 32S=4 32F=5 64F=6
uchar arr[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
Mat src(2, 3, CV_8UC3, arr);
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++)
	{
		for (int c = 0; c < src.channels(); c++)
		{
			cout << static_cast<unsigned>(src.at<Vec3b>(i, j)[c]) << endl;
		}
	}
}
// cout 0,1,2,3,...,17

uchar arr2[] = { 0,1,2,3,4,5 };
Mat img(2, 3, CV_8UC1, arr2);
for (int i = 0; i < img.rows; i++)
{
	for (int j = 0; j < img.cols; j++)
	{
		cout << static_cast<unsigned>(img.at<uchar>(i, j)) << endl;
	}
}
// cout 0,1,2,...,5

OpenCV中Mat指定位置的元素值(分为单通道和三通道)

#include<iostream>
#include<opencv2/core.hpp>

using namespace std;
using namespace cv;

int main()
{
	cout << "Hello!" << endl;

	Mat src(2, 3, CV_8UC3);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			for (int c = 0; c < src.channels(); c++)
			{
				src.at<Vec3b>(i, j)[c] = i * src.cols + j + c * src.cols * src.rows;  // i行j列c通道
			}
		}
	}
	cout << static_cast<unsigned>(src.at<Vec3b>(1, 0)[2]) << endl;  // 打印第2行第1列第3通道元素值

	Mat img(2, 3, CV_8UC1);
	for (int i = 0; i < img.rows; i++)
	{
		for (int j = 0; j < img.cols; j++)
		{
			img.at<uchar>(i, j) = i * img.cols + j;  // i行j列
		}
	}
	cout << static_cast<unsigned>(img.at<uchar>(1, 0)) << endl;  // 打印第2行第1列元素值

    Mat im(2, 3, CV_8UC3);
	Mat_<Vec3b>::iterator it = im.begin<Vec3b>(), itEnd = im.end<Vec3b>();  // 遍历所有位置 rows*cols
	for (; it != itEnd; ++it)
	{
		(*it)[0] = 2;  // 第1个通道
		(*it)[1] = 25;  // 第2个通道
		(*it)[2] = 255;  // 第3个通道
	}
	cout << static_cast<unsigned>(im.at<Vec3b>(1, 0)[2]) << endl;  // 打印第2行第1列第3通道元素值

    return 0;
}

二、opencv

  OpenCV中矩阵Mat操作

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
	// 创造矩阵
	Mat image(240, 320, CV_8UC3);  // Create a matrix
	image.create(480, 640, CV_8UC3);  // (re)allocate a pre-declared matrix

	// 创造带常数的矩阵
	Mat A33(3, 3, CV_32F, Scalar(5)); 
	Mat B33(3, 3, CV_32F); B33 = Scalar(5);
	Mat C33 = Mat::ones(3, 3, CV_32F) * 5;
	Mat D33 = Mat::zeros(3, 3, CV_32F) + 5.;

	// 创造带指定元素值的矩阵
	double a = CV_PI / 3;
	Mat A22 = (Mat_<float>(2, 2) << cos(a), -sin(a), sin(a), cos(a));
	float B22data[] = { cos(a), -sin(a), sin(a), cos(a) };
	Mat B22 = Mat(2, 2, CV_32F, B22data).clone();

	// 初始化随机矩阵
	randu(image, Scalar(0), Scalar(256)); // uniform dist
	randn(image, Scalar(128), Scalar(10)); // Gaussian dist

	// 指针转Mat
	float* Idata = new float[480 * 640 * 3];
	Mat I(480, 640, CV_32FC3, Idata);
	
	// vector转Mat 
	vector<Point> iptvec(10);
	Mat iP(iptvec); // iP – 10x1 CV_32SC2

	// 修改元素值 A33  dyImage  image
	A33.at<float>(1, 2) = A33.at<float>(2, 1) + 1;  // A33 CV_32F
	Mat dyImage(image.size(), image.type());        // image CV_8UC3
	for (int y = 1; y < image.rows - 1; y++)        // row
	{
		Vec3b* prevRow = image.ptr<Vec3b>(y - 1);   // Vec3b相当于长度为3类型为uchar的vector
		Vec3b* nextRow = image.ptr<Vec3b>(y + 1);   // ptr可以获得指向每一行首地址的指针
		for (int x = 0; x < image.cols; x++)        // col
			for (int c = 0; c < 3; c++)             // channel
				dyImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(nextRow[x][c] - prevRow[x][c]); // 防止溢出
	}
	Mat_<Vec3b>::iterator it = image.begin<Vec3b>(), itEnd = image.end<Vec3b>();  // 遍历所有位置 rows*cols
	for (; it != itEnd; ++it)
	{
		(*it)[1] ^= 255;  // 第二个通道做处理
	}

	return 0;
}

三、minMaxLoc

void main()
{
	Mat src = imread("000000000149.jpg", IMREAD_GRAYSCALE);
	cout << "src size = " << src.size() << endl;  // w *h
	cout << "src width = " << src.cols << endl;
	cout << "src height = " << src.rows << endl;

	double minVal, maxVal;
	cv::Point minLoc, maxLoc;
	cv::minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc);
	cout << "minVal = " << minVal << ", minLoc = " << minLoc << endl;
	cout << "maxVal = " << maxVal << ", maxLoc = " << maxLoc << endl;

	double minV, maxV;
	int minIdx[2], maxIdx[2];
	cv::minMaxIdx(src, &minV, &maxV, minIdx, maxIdx);
	cout << "minV = " << minV << ", minIdx_x = " << minIdx[1] << ", minIdx_y = " << minIdx[0] << endl;
	cout << "maxV = " << maxV << ", maxIdx_x = " << maxIdx[1] << ", maxIdx_y = " << maxIdx[0] << endl;

	double maxValue;
	cv::Point maxLocation;
	cv::minMaxLoc(src, NULL, &maxValue, NULL, &maxLocation);  // 只求最大值及对应坐标
	cout << "maxValue = " << maxValue << ", maxLocation = " << maxLocation << endl;

	cv::Mat mask = cv::Mat::zeros(src.size(), CV_8UC1);
	cv::Rect rect(0, src.rows / 2, src.cols / 2, src.rows / 2);
	mask(rect).setTo(cv::Scalar(255));

	double minValue;
	cv::Point minLocation;
	cv::minMaxLoc(src, &minValue, NULL, &minLocation, NULL, mask);  // 限定在mask区域内
	cout << "minValue = " << minValue << ", minLocation = " << minLocation << endl;

	cv::namedWindow("imshow", cv::WINDOW_NORMAL);
	cv::imshow("imshow", src);
	cv::waitKey(0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值