opencv基础
一.Mat初始化
1.初始化
https://blog.youkuaiyun.com/m0_37874102/article/details/114023446
注意:
cv::Mat::size()的返回值为cv::Size,可用于初始化
cv::Mat::size类型为cv::MatSize,不能用于初始化
2.深度拷贝
Mat =为赋值
copyTo和clone为深度拷贝
如下面代码所示img4 = img,当img变化时,img4也随之变换。但是通过copyTo和clone赋值的img1和img2并不会随之发生变化。
#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
cv::Mat img = cv::imread("test.png", IMREAD_GRAYSCALE);
cv::Mat img1(img.size(), CV_32FC3);
cv::Mat img2(img.size(), img.type());
cv::Mat img3(cv::Mat::zeros(640, 640, 3));
cv::Mat img4 = img;
img1 = img.clone();
img2.copyTo(img);
img = Scalar(255, 255, 255);
cv::namedWindow("img", WINDOW_NORMAL);
cv::imshow("img", img);
cv::namedWindow("img1", WINDOW_NORMAL);
cv::imshow("img1", img1);
cv::namedWindow("img2", WINDOW_NORMAL);
cv::imshow("img2", img1);
cv::namedWindow("img3", WINDOW_NORMAL);
cv::imshow("img3", img3);
cv::namedWindow("img4", WINDOW_NORMAL);
cv::imshow("img4", img4);
cv::waitKey(0);
cv::destroyAllWindows;
}
二、图像像素读写
对彩色图像和灰度图像因为通道数不同,所以像素遍历不同,每个像素存放的数据类型不相同。灰度图像只有一个通道,直接存在一个基本变量中,而彩色图像有三个通道存放在了Vector中。
通过指针遍历更快。
void QuickDemo::pixel_visit_demo(Mat &image) {
int w = image.cols;
int h = image.rows;
int dims = image.channels();
/*
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
if (dims == 1) { // 灰度图像
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - pv;
}
if (dims == 3) { // 彩色图像
Vec3b bgr = image.at<Vec3b>(row, col);
image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
}
}
}
*/
for (int row = 0; row < h; row++) {
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++) {
if (dims == 1) { // 灰度图像
int pv = *current_row;
*current_row++ = 255 - pv;
}
if (dims == 3) { // 彩色图像
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
imshow("像素读写演示", image);
}
三、图像像素的算数操作
opencv中图像即Mat,Mat可以直接和Scalar以及其他图像进行运算,直接对Mat进行加减乘除算数运算就可以对图像进行修改。如果超过像素值的最大最小的取值范围,那么函数会对像素值置255/0。
void QuickDemo::operators_demo(Mat &image) {
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(5, 5, 5);
// 加法
/*
int w = image.cols;
int h = image.rows;
int dims = image.channels();
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
Vec3b p1 = image.at<Vec3b>(row, col);
Vec3b p2 = m.at<Vec3b>(row, col);
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);
}
}
*/
divide(image, m, dst);
imshow("除法操作", dst);
}