opencv4学习总结-Mat创建和使用

Mat类的介绍

Mat类表示n维单通道或多通道的密集数值数组,它可用于存储实值或复数向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图。

使用实例

创建一个7×7的复数矩阵并用1+3j填充

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

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_32FC2, Scalar(1, 3));



    waitKey(0);
    destroyAllWindows();

    return 0;
}

接下来打断点调试,更为生动的查看这段数据

下面这段内存就是存在矩阵M里面的数据,由于是32位矩阵,所以每段数据占四个字节,里面的0000803f从内存中提取出来就是0x3f800000,根据浮点数的转换规则,转换为十进制就是1.0,后面的0x40400000转换为浮点数十进制为3.0,可以观察到双通道的数据布局方式。

将上面矩阵转换为另一格式

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

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_32FC2, Scalar(1, 3));
    M.create(100, 60, CV_8UC(15));


    waitKey(0);
    destroyAllWindows();

    return 0;
}

create函数会让让新的数据格式覆盖掉原先的数据

对Mat矩阵进行行列变换

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

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_8UC1, Scalar(1));
    //第五行乘3加第三行赋值给第三行
    M.row(3) = M.row(3) + M.row(5) * 3;
    //把第六列复制给第一列,这里不能用等于号赋值,具体原因我还没搞明白,感觉可能是行和列格式不一样吧
    Mat M1 = M.col(1);
    M.col(6).copyTo(M1);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

创建一个BGR3通道图像

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

using namespace cv;
using namespace std;


int main()
{
    //创建一个320×240的3通道BGR彩色图像
    Mat img(Size(320, 240), CV_8UC3);
    imshow("src", img);
    //定义一个img上的区域
    Mat roi(img, Rect(10, 10, 100, 100));
    //赋值为绿色
    roi = Scalar(0, 255, 0);
    imshow("dst", roi);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

对图像的复制,获取图像信息等操作

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

using namespace cv;
using namespace std;


int main()
{
	Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg");
	Mat m1, m2;
	m1 = image.clone();
	image.copyTo(m2);

	//创建空白图像
	Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
	std::cout << m3 << std::endl;
	//获取图像宽度
	int width = image.cols;
	//获取图像高度
	int height = image.rows;
	//获取图像通道数
	int dim = image.channels();
	int d = image.depth();
	int t = image.type();
	printf("width:%d,height:%d,channel:%d,depth:%d,type:%d\n", width, height, dim, d, t);

	//创建单通道8位矩阵
	Mat t1 = Mat(256, 256, CV_8UC1);
	//给t1赋值
	t1 = Scalar(0);
	imshow("t1", t1);
	Mat t2 = Mat(Size(256, 256), CV_8UC3);
	t2 = Scalar(255, 0, 255);
	imshow("t2", t2);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

对Mat进行遍历

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

using namespace cv;
using namespace std;


int main()
{
    Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg",IMREAD_GRAYSCALE);
    if (image.empty())
    {
        printf("no such picture");
        return -1;
    }
    imshow("input", image);
    int height = image.rows;
    int width = image.cols;
    int channels = image.channels();
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            if (channels == 3)
            {
                Vec3b pixel = image.at<Vec3b>(row, col);
                int blue = pixel[0];
                int green = pixel[1];
                int red = pixel[2];
                image.at<Vec3b>(row, col)[0] = 255 - blue;
                image.at<Vec3b>(row, col)[1] = 255 - green;
                image.at<Vec3b>(row, col)[2] = 255 - red;
            }
            else if (channels == 1)
            {
                int p = image.at<uchar>(row, col);
                image.at<uchar>(row, col) = 255 - p;
            }
        }
    }
    imshow("output", image);


    waitKey(0);
    destroyAllWindows();

    return 0;
}

opencv4学习总结-图像加载

imread函数原型

Mat imread( const String& filename, int flags = IMREAD_COLOR );
  • 返回值:Mat类型,返回读取的图像Mat对象,如果读取图像失败则返回一个空的Mat对象
  • 参数1 filename:读取的图片文件名,可以写绝对路径或相对路径
  • 参数2 flags:读取标记,默认值为IMREAD_COLOR,表示用什么颜色格式读取图片
可读取的图片格式:

-   Windows bitmaps - \*.bmp, \*.dib (always supported)
-   JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Note* section)
-   JPEG 2000 files - \*.jp2 (see the *Note* section)
-   Portable Network Graphics - \*.png (see the *Note* section)
-   WebP - \*.webp (see the *Note* section)
-   Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported)
-   PFM files - \*.pfm (see the *Note* section)
-   Sun rasters - \*.sr, \*.ras (always supported)
-   TIFF files - \*.tiff, \*.tif (see the *Note* section)
-   OpenEXR Image files - \*.exr (see the *Note* section)
-   Radiance HDR - \*.hdr, \*.pic (always supported)
-   Raster and Vector geospatial data supported by GDAL (see the *Note* section)
  • IMREAD_UNCHANGED = -1;按原样返回加载的图像
  • IMREAD_GRAYSCALE = 0;将图像转换为单通道灰度图像加载
  • IMREAD_COLOR = 1;将图像转换为BGR彩色图像加载
  • IMREAD_ANYDEPTH = 2;具有相应深度时返回16位/32位图像,否则返回8位图像
  • IMREAD_ANYCOLOR = 4;以任何可能的颜色形式读取图像
  • IMREAD_LOAD_GDAL = 8;使用gdal驱动程序加载图像
  • IMREAD_REDUCED_GRAYSCALE_2 = 16;将图像转换为单通道灰度图像并且图像尺寸减小二分之一
  • IMREAD_REDUCED_COLOR_2 = 17;将图像转换为3通道BGR彩色图像并且图像尺寸减小二分之一
  • IMREAD_REDUCED_GRAYSCALE_4 = 32;将图像转换为单通道灰度图像并且图像尺寸减小四分之一
  • IMREAD_REDUCED_COLOR_4 = 33;将图像转换为3通道BGR彩色图像并且图像尺寸减小四分之一
  • IMREAD_REDUCED_GRAYSCALE_8 = 64;将图像转换为单通道灰度图像并且图像尺寸减小八分之一
  • IMREAD_REDUCED_COLOR_8 = 65;将图像转换为3通道BGR彩色图像并且图像尺寸减小八分之一
  • IMREAD_IGNORE_ORIENTATION = 128;设置了之后部根据EXIF方向标志来旋转图像

代码示例

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

using namespace cv;
using namespace std;


int main()
{
    Mat src = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg",IMREAD_COLOR);
    if (src.empty())
    {
        printf("check your picture");
        return -1;
    }
    imshow("input", src);



    waitKey(0);
    destroyAllWindows();

    return 0;
}