OpenCv 学习笔记(一)

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/yaowangII/article/details/84326669

一、cv::Mat image 创建一个宽和高都是0的图像,可以通过调用cv::Mat的size()方法来获取该图像的尺寸,默认为0*0。

二、对一个图像文件的读取

	cv::Mat pic; //mat类是用于保存图像以及其他矩阵数据的数据结构,默认下,它的尺寸为了0
    qDebug()<<pic.size().height<<","<<pic.size().width;

    pic = imread("D:/lcm/file/shareFile/qtProject/winOpencv/pic/2.jpg" );// 读取一个图像

    if(!pic.data) // 在使用图像前检查图像是否正确读取,如果文件不存在,文件损坏,格式无法识别,将会出错
    {
        qDebug()<<"pic error";
    }

    namedWindow("mainWindow",WINDOW_NORMAL); //定义一个需要进行图像显示的窗口
    imshow("mainWindow",pic); // 在指定的窗口中显示图像

    Mat result;             //水平翻转,在另一个窗口显示
    flip(pic,result,1);
    namedWindow("flipWindow",WINDOW_NORMAL);
    imshow("flipWindow",result);

    Mat result2;            //垂直翻转,在另一个窗口显示
    flip(pic,result2,0);
    namedWindow("flipWindow2",WINDOW_NORMAL);
    imshow("flipWindow2",result2);

    imwrite("D:/lcm/file/shareFile/qtProject/winOpencv/pic/output.bmp",result2); //将翻转的图片,保存成bmp格式
}

三、cv::Mat 只要是用于保存图像以及其他矩阵数据的数据结构,它的默认尺寸为了,也可以指定它的初始尺寸
cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
240,320为指定图像的宽和高,同时需要指定矩阵中元素的类型,这里的CV_8U对应的是单字节的像素图像。字母U意味着无符号的,也可以用字母S声明带符号的类型。对于彩色的图像,我们需要指定3个通道(CV_8UC3),也可以声明16位或者32位的无符号或者带符号的整形图像,如CV_16SC3,也可以声明32位或者64位的浮点数,如CV_32F。
当cv::Mat 离开作用域后,分配的内存将会自动释放,可以避免内存泄露。另外cv::Mat实现了引用计数和浅拷贝计数,当图像之间进行赋值时,图像数据并没有发生赋值,两个对象都指向同一块内存,这也用于参数传值的图像和,返回值传值的图像。引用计数的作用是当只有当所有引用内存数据的对象都被析构后,才会释放内存块。如果希望创建的图像拥有原始图像的拷贝,那么需要使用copyTo()方法。
如:

cv::Mat image image1;
image = result; // 两个对象拥有同一份数据,改一个,边两个
result.copyTo(image1);//创建新的拷贝

四、将cv::Mat 的图像显示在Qt Label中
cv::Mat 中图像的三个颜色通道按BGR顺序排列,而Qt中是按RGB顺序排列,所以需要进行转换
如:

cv::Mat image;
image.iread(XXXXX);
cv::cvtColor(image,image,CV_BGR2RGB);
//以下Qt图像
QImage img = QImage((const unsigned char *)(image.data),image,cols,image,rows,QImage::Format_RGB888);
//显示在QLabe中
ui->label->setPixmap(QPixmap::fromImage(img));

猜你喜欢

转载自blog.csdn.net/yaowangII/article/details/84326669