opencv(mat与qimage 的互转)及简单的图像处理

  • 一、opencv库文件
  • 二、使用方式(Qt)
  • 三、QImage 转 Mat (不太全,多多指教)
  • 四、Mat转 QImage
  • 五、一些简单的图像处理操作
    • 1、图片的滤色
    • 2、图片的反色
    • 3、图像的提色

一、opencv库文件

编译好的opencv 库。

点击这里进行下载

二、使用方式(Qt)

把上面下载的opencv.zip 解压出来的include和lib 文件夹放到工程文件夹里面,并在pro 文件中添加以下代码,即可使用

INCLUDEPATH +=$$PWD\includeINCLUDEPATH +=$$PWD\include\opencvINCLUDEPATH +=$$PWD\include\opencv2LIBS +=$$PWD\lib/libopencv_*.a

三、QImage 转 Mat (不太全,多多指教)

通过判断QImage 的类型 在调用Mat 的构造函数进行转换,代码都有进行注释
代码如下(示例):

cv::Mat ImageHandle::QImage2Mat(QImage image)
{cv::Mat mat;   //创建一个mat对象来接收switch (image.format())  //QImage 的一个库函数 可以返回图片的类型{case QImage::Format_ARGB32_Premultiplied:  //RGB32 为四通道的所以在调用mat构造函数需要转换成四通道的mat类型(CV_8UC4)mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:   //RGB888 即RGB24 三通道八位的图片 所以转成三通道的mat(CV_8UC4)mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());//因为Qimage 是RGB 通道 而 Mat 为 BGR 通道 所以需要使用cvtcolor进行转换,不然图片通道会颠倒cv::cvtColor(mat, mat,cv::COLOR_RGB2BGR); break;case QImage::Format_Indexed8:  //Indexed8 为单通道的图片 所以在转换成mat 也是单通道(CV_8UC1)mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat;
}

四、Mat转 QImage

跟上面一样也是通过判断mat的通道 调用QImage的构造函数来进行转换

QImage ImageHandle::Mat2QImage(cv::Mat mat)
{if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);//转换为qimage 单通道颜色值image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}uchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}else if(mat.type() == CV_8UC3){QImage image((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){const uchar *pSrc = (const uchar*)mat.data;QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image;}else{return QImage();}
}

五、一些简单的图像处理操作

1、图片的滤色

通过mat的宽高来访问图片的所有像素点 并删除对应的颜色

QImage ImageHandle::ImageColorDelete(QImage &image, int flag)
{cv::Mat mat = this->QImage2Mat(image);cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());int chl = mat.channels();//遍历像素点 滤除每个像素点所对应的颜色值,从而达到滤色的效果for(int row=0;row<mat.rows;row++){for(int col=0;col<mat.cols;col++){if(chl == 3){switch (flag){case BLUE:dst.at<cv::Vec3b>(row,col)[0] = 0;dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];break;case GREEN:dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];dst.at<cv::Vec3b>(row,col)[1] = 0;dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];break;case RED:dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];dst.at<cv::Vec3b>(row,col)[2] = 0;break;}}}}return this->Mat2QImage(dst);
}

2、图片的反色

操作每个像素点,每个像素点的像素进行取反得到反色效果

QImage ImageHandle::ImageContraryColor(QImage &image)
{cv::Mat mat = this->QImage2Mat(image);cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());int chl = mat.channels();//操作每个像素点,每个像素点的像素进行取反得到反色效果for(int row=0;row<mat.rows;row++){for(int col=0;col<mat.cols;col++){if(chl == 3){dst.at<cv::Vec3b>(row,col)[0] = 255 - mat.at<cv::Vec3b>(row,col)[0];dst.at<cv::Vec3b>(row,col)[1] = 255 - mat.at<cv::Vec3b>(row,col)[1];dst.at<cv::Vec3b>(row,col)[2] = 255 - mat.at<cv::Vec3b>(row,col)[2];}}}return this->Mat2QImage(dst);
}

3、图像的提色

遍历像素点 提取所对应的颜色

cv::Mat mat = this->QImage2Mat(image);cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());int chl = mat.channels();//遍历像素点 提取所对应的颜色for(int row=0;row<mat.rows;row++){for(int col=0;col<mat.cols;col++){if(chl == 3){switch (flag){case BLUE:dst.at<cv::Vec3b>(row,col)[0] = mat.at<cv::Vec3b>(row,col)[0];dst.at<cv::Vec3b>(row,col)[1] = 0;dst.at<cv::Vec3b>(row,col)[2] = 0;break;case GREEN:dst.at<cv::Vec3b>(row,col)[0] = 0;dst.at<cv::Vec3b>(row,col)[1] = mat.at<cv::Vec3b>(row,col)[1];dst.at<cv::Vec3b>(row,col)[2] = 0;break;case RED:dst.at<cv::Vec3b>(row,col)[0] =0;dst.at<cv::Vec3b>(row,col)[1] = 0;dst.at<cv::Vec3b>(row,col)[2] = mat.at<cv::Vec3b>(row,col)[2];break;}}}}return this->Mat2QImage(dst);

刚开始主要还是记录一下自己实现的功能,后面还会进行更新opencv 的图像处理部分

opencv QImage与Mat 互转 及简单的图像处理相关推荐

  1. bitmap与mat互转方便opencv操作

    bitmap与mat互转方便opencv操作 前言 老实说接下来要说的有点复杂,甚至还有可能不够特别详细.所以哪里有不懂的,可以在这篇博客下留言,我也会及时回复留言和修改这篇博客. 开发工具是andr ...

  2. Dlib学习笔记:dlib array2d与 OpenCV Mat互转

    Dlib学习笔记:dlib array2d与 OpenCV Mat互转 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/7 ...

  3. QImage与OpenCV中的MAT图像格式转换

    1.Mat转换为QImage QImage Mat2QImage(const Mat& mat) { Mat rgb; cvtColor(mat, rgb, CV_BGR2RGB);     ...

  4. 基于OpenCV的彩色空间互转

    Datawhale干货 作者:姚童,Datawhale优秀学习者 图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效:另外,相比RGB,其他颜色空间(比如HSV.HSI)更具可分离性 ...

  5. 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

    翻译:陈之炎 校对:吴振东.林夕本文约3600字,建议阅读10分钟本文为大家系统地介绍了OpenCV官方教程. 写在前边 让读者朋友们较为系统地了解和学习OpenCV官方教程,数据派THU翻译组联合研 ...

  6. openCV图像矩阵Mat和二维数组的互相转换

    openCV图像矩阵Mat和二维数组的互相转换 在openCV的应用中,我们获取图像的矩阵信息很简单.但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算.那么我们就需要把openCV读取 ...

  7. QImage与Mat之间的相互转换

    Mat转QImage Mat mat=imread("c:/dev/test.jpg"); cvtColor(mat, mat, CV_BGR2RGB); QImage image ...

  8. 【QT】QT从零入门教程(十五):QImage和Mat的转换

      QT处理图像用的是QImage类,而OpenCV处理图像则是使用cv::Mat类,如果要在QT中运用OpenCV,那就需要进行QImage和Mat的相互转换. // cv::Mat转换成QImag ...

  9. Qt开发基础(7)——QImage与Mat之间的相互转换

    Mat转QImage Mat mat=imread("c:/dev/test.jpg"); cvtColor(mat, mat, CV_BGR2RGB); QImage image ...

最新文章

  1. mysql插入的时候是否需要commit
  2. RMSD:通过旋转计算两个分子间的最小rmsd
  3. IDEA 中比较骚后缀补全技巧!你可能没用过
  4. python 运算符重载_零基础小白Python入门必看:面向对象之典型魔术方法
  5. pigcms 标签读不出
  6. 网页级在线性能测试网站汇总
  7. Java集合:HashMap源码剖析
  8. Web移动应用调试工具——Weinre
  9. html section 布局,section标签的用法
  10. Android开发之Scroller
  11. 刘敏华:2013年网络营销行业展望
  12. Shell脚本学习-阶段六-密钥的批量分发与执行
  13. c语言中.和-区别,c语言中-和.的区别
  14. 软件测试常见分辨率测试,如何用imatest测分辨率 imatest软件测试分辨率图文教程...
  15. 宝峰uv5r保存信道频率_宝峰UV-5R上中继台的信道存储设置方法
  16. 自定义启动 android_什么是自定义Android启动器,以及为什么可能要使用一个
  17. qt开源项目: tiled 瓦片 游戏地图编辑器
  18. Substrate源码分析:启动流程
  19. 设计模式系列:依赖倒置原则
  20. 深开鸿携手深业健康、家具协会打造智慧康养新模式,推动行业新标建设

热门文章

  1. deepin linux 2014下载,Deepin 2014官方正式发布下载
  2. 如何使用MySQL的全文本搜索功能
  3. 20155314 2016-2017-2 《Java程序设计》第9周学习总结
  4. 超导计算机国防科技大学,超导材料的性能与应用综述
  5. Cuda CuDnn Pytorch 安装 print(torch.cuda.is_available())输出报错。NVDIA 940MX
  6. 自定义拍照时 拍照界面_摄影技巧,拍照时模特的眼睛应看向哪里?不同的眼神方向有何区别...
  7. 电脑通过android手机上网 .
  8. 电脑的网络,一会通一会不通,一般是IP冲突
  9. C中格式化输出%lf,输出为保留6位小数的数。
  10. 基于GM(0,N)的时间序列预测R实现