opencv(四) 图像基本操作,矩阵的释放,深度拷贝,浅拷贝,矩阵转置
opencv(四) 图像基本操作,矩阵的释放,深度拷贝,浅拷贝,矩阵转置
1.矩阵释放
2.矩阵的拷贝
3.矩阵的转置
1.矩阵释放
输出结果:
2.矩阵的拷贝
2.1浅拷贝
输出结果
2.2深度拷贝
输出结果
2.3 图像复制
输出结果
3矩阵转置
输出结果
4.源代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
int main(int argc, char** argv) {
cv::String imgPath = "F:/软件开发/qt开发/08opencv/opencv素材/Image/";
cv::String fileName = "Luffy.png";
//cv::String fileName = "opencvlog.jpg";
//cv::String fileName = "mybaby.png";cv::String pathFile = imgPath + fileName;
cv::Mat src, srcGray;src = cv::imread(pathFile); // 采用默认方式读取图像
if (src.data == NULL) {
printf("图像赌徒失败\n");
return -1;
}
cv::imshow("1. 默认读图", src);srcGray = cv::imread(pathFile, cv::IMREAD_GRAYSCALE);
//cv::imshow("2. 转换成灰度读图", srcGray);
/*
1.矩阵释放
2.矩阵的复制
3.矩阵的转置
*/
// 1. 矩阵释放
int rows = 3;
int cols = 3;
cv::Mat mat1 = cv::Mat::ones(rows,cols,CV_8UC1);
std::cout << "矩阵释放前\n" << mat1 << std::endl;
mat1.release();
std::cout << "矩阵释放后\n" << mat1 << std::endl;
// 2. 矩阵拷贝
// 2.1 浅拷贝
cv::Mat mat2(src);
cv::imshow("浅拷贝数据", mat2);
// 浅拷贝,公用同一数据源,改变数据会影响两个矩阵
/*
CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
*/
cv::rectangle(mat2, cv::Rect(50,50,150,150),cv::Scalar(0,255,255),4);
cv::imshow("修改数据mat2", mat2);
cv::imshow("修改后src", src);// 2.2 深拷贝
cv::Mat mat3 = src.clone();
cv::imshow("深拷贝", mat3);
cv::rectangle(mat3, cv::Rect(50, 50, 150, 150), cv::Scalar(255, 0, 0), 4);
cv::imshow("修改生拷贝图像",mat3);
cv::imshow("深拷贝源图像", src);
// 2.3 图像复制
cv::Mat mat4(src.size(), src.type());
src.copyTo(mat4);
cv::imshow("复制图像", mat4);
cv::rectangle(mat3, cv::Rect(50, 50, 150, 150), cv::Scalar(255, 0, 0), 4);
cv::imshow("修改生复制图像", mat3);
cv::imshow("复制源图像", src);// 3. 矩阵转置
cv::Mat mat5;
cv::transpose(src, mat5);
cv::imshow("矩阵转置", mat5);cv::waitKey(0);
system("pause");
return 0;
}