赞
踩
https://blog.csdn.net/m0_37874102/article/details/114023446
注意:
cv::Mat::size()的返回值为cv::Size,可用于初始化
cv::Mat::size类型为cv::MatSize,不能用于初始化
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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。