1、Mat对象使用:
- 部分复制:
一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
Mat A= imread(imgFilePath);
Mat B(A) // 只复制
- 完全复制:
如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
Mat F = A.clone(); 或 Mat G; A.copyTo(G);
2、Mat对象使用四个要点:
- 输出图像的内存是自动分配的
- 使用OpenCV的C++接口,不需要考虑内存分配问题
- 赋值操作和拷贝构造函数只会复制头部分
- 使用clone与copyTo两个函数实现数据完全复制
3、Mat对象创建:
-
cv::Mat::Mat构造函数
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致 -
创建多维数组cv::Mat::create
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC1, Scalar::all(0)); -
cv::Mat::create实现
Mat M;
M.create(4, 3, CV_8UC2);
M = Scalar(127,127);
cout << “M = " << endl << " " << M << endl << endl;
uchar* firstRow = M.ptr<uchar>(0);
printf(”%d", *firstRow);
4、定义小数组
Mat C = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
演示代码:
//#include"opencv2/highgui/highgui.hpp"
//#include"opencv2/imgproc/imgproc.hpp"
//using namespace cv;
//
//int main(int argc, char** argv)
//{
// namedWindow("Example3", WINDOW_FREERATIO);
// VideoCapture cap;
// cap.open(string(argv[1]));
// Mat frame;
// for (;;)
// {
// cap >> frame;
// if (frame.empty()) break;
// imshow("Example3", frame);
// if (waitKey(33) >= 0) break;
// }
//
// return 0;
//}
//#include <opencv2/opencv.hpp>
//#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** args) {
Mat image = imread("D:/PT/cx.jpg", IMREAD_COLOR);
if (image.empty()) {
cout << "could not find the image resource..." << std::endl;
return -1;
}
int height = image.rows;
int width = image.cols;
int channels = image.channels();
printf("height=%d width=%d channels=%d", height, width, channels);
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (channels == 3) {
image.at<Vec3b>(row, col)[0] = 0; // blue
image.at<Vec3b>(row, col)[1] = 0; // green
}
}
}
//hello,树先生
//Mat dst;
//dst = Mat(image.size(), image.type());
//dst = Scalar(170, 0, 255);
//克隆
//Mat dst = image.clone();
//copyTo
Mat dst;
image.copyTo(dst);
namedWindow("My Image", CV_WINDOW_AUTOSIZE);
namedWindow("My Image2", CV_WINDOW_AUTOSIZE);
imshow("My Image", image);
imshow("My Image2", dst);
cout << "看你出不出来!"<<endl;
waitKey(0);
return 0;
}
日常(2):
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("D:/PT/mr.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("Example1", CV_WINDOW_AUTOSIZE);
Mat dst;
//dst = src.clone();
//dst = Mat(src.size(), src.type());
//dst = Scalar(127, 0, 255);
cvtColor(src, dst, CV_BGR2GRAY);
namedWindow("Example2", CV_WINDOW_AUTOSIZE);
//printf("通道数: %d",dst.channels());
cout << "通道数:" << dst.channels() << endl;
//int cols = dst.cols;
//int rows = dst.rows;
const uchar* firstRow = dst.ptr<uchar>(0);//第一行第一列的像素的值
printf("first pixel value :%d", *firstRow);//解引用
//imshow("Example2", dst);
//Mat output_image;
//cvtColor(src, output_image, CV_BGR2HLS);
原图像 转换后的图像 转换的颜色
//imshow("Example2", output_image);
//imwrite("D:/PT/saveHLS.png", output_image);
Mat M(100, 100, CV_8UC3, Scalar(0, 0, 255));
namedWindow("Example3", CV_WINDOW_AUTOSIZE);
imshow("Example3", M);
waitKey(0);
return 0;
}