笔记系列
参考书籍:OpenCV3编程入门
作者:毛星云
版权方:电子工业出版社
出版日期:2015-02
笔记仅供本人参考使用,不具备共通性
笔记中代码均是OpenCV+Qt的代码,并非用vs开发,请勿混淆
图像处理
计算机视觉
OpenCV
Open Source Computer Vision Library
一款基于开源发行的跨平台计算机视觉库
实现了图像处理和计算机视觉发面的很多通用算法
初学OpenCV时,先了解一下OpenCV的整体模块架构,再重点学习和突破自己感兴趣的部分,就会有得心应手,一览众山小的学习体验
通过OpenCV安装路径下include目录里面头文件的分类存放,来略读一下它的庞杂组织架构
进入到...\opencv\build\include\opencv2
目录
在该目录中,找到opencv_modules.hpp
的hpp文件
该文件中存放的是OpenCV2中与新模块构造相关的说明代码:
/*
* ** File generated automatically, do not modify **
* ** 文件自动生成,请勿修改 **
*
* This file defines the list of modules available in current build configuration
*
* 该文件定义了当前构建配置中可用的模块列表
*
*/
// This definition means that OpenCV is built with enabled non-free code.
// 这个定义意味着OpenCV是用启用的非自由代码构建的
// For example, patented algorithms for non-profit/non-commercial use only.
// 例如,专利算法只能用于非营利/非商业用途。
/* #undef OPENCV_ENABLE_NONFREE */
#define HAVE_OPENCV_CALIB3D
#define HAVE_OPENCV_CORE
#define HAVE_OPENCV_DNN
#define HAVE_OPENCV_FEATURES2D
#define HAVE_OPENCV_FLANN
#define HAVE_OPENCV_GAPI
#define HAVE_OPENCV_HIGHGUI
#define HAVE_OPENCV_IMGCODECS
#define HAVE_OPENCV_IMGPROC
#define HAVE_OPENCV_ML
#define HAVE_OPENCV_OBJDETECT
#define HAVE_OPENCV_PHOTO
#define HAVE_OPENCV_STITCHING
#define HAVE_OPENCV_VIDEO
#define HAVE_OPENCV_VIDEOIO
如上,L17~L31就是OpenCV的所有模块,按照宏定义的顺序依次介绍
略
此处主要提供Windows环境下Qt+Opencv的配置
转载文章:
Qt-OpenCV开发环境搭建(史上最详细)
拜小白教你Qt5.8.0+OpenCV3.2.0配置教程(详细版)
在创建qt新项目后,需要在pro文件中添加如下代码,以能够使用OpenCV的库
//在pro文件的最后添加如下代码
INCLUDEPATH += F:\opencv\buildopencv\install\include\
F:\opencv\buildopencv\install\include\opencv2\
F:\opencv\buildopencv\install\include\opencv
LIBS += -L F:\opencv\buildopencv\install\x64\mingw\lib\libopencv_*.a
注意:只要使用到OpenCV的库,就必须加入上述代码
在新版OpenCV中,图像显示过程非常简单,只需用imread
函数载入到新版本的图像存储数据结构Mat类中,然后用imshow函数显示即可。
文件:main.cpp
#include "mainwindow.h"
#include
//上面两个是qt有的,暂时不理会
#include
using namespace cv;//包含cv命名空间
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】载入图片
Mat srcImage = imread("test.jpg");
//图片要放在debug目录下,或者直接用完整的绝对地址,如下
//Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpg");
//【2】显示图像
//此处不可显示中文,后期再寻解决之道
imshow("[original image]",srcImage);
//【3】等待任意键按下
waitKey(0);
}
腐蚀,即用图像中的暗色部分“腐蚀”掉图像中的高亮部分
文件:main.cpp
#include "mainwindow.h"
#include
#include //OpenCV highgui模块头文件
#include //OpenCV 图像处理模块头文件
using namespace cv; //包含cv命名空间
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】载入原图
Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
//【2】显示原图
imshow("original image",srcImage);
//【3】进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
//【4】显示效果图
imshow("Effect picture",dstImage);
waitKey(0);
return 0;
}
程序首先载入和显示一幅原视图像(original image)
然后定义一个Mat类型的变量来获得getStructuringElement函数
的返回值,即指定形状和尺寸的结构元素(内核矩阵)
接着调用erode函数
进行图像腐蚀操作,最后调用imshow函数
进行显示效果图(Effect picture)
图像模糊即使用OpenCV对图像进行均值滤波操作,其主要用到了blur函数
文件:main.cpp
#include "mainwindow.h"
#include
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】载入原始图
Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
//【2】显示原始图
imshow("original image",srcImage);
//【3】进行均值滤波操作
Mat dstImage;
blur(srcImage,dstImage,Size(7,7));
//【4】显示效果图
imshow("Effect picture",dstImage);
waitKey(0);
return 0;
}
代码很好理解,先照常加载显示原始图,再调用一次blur函数,最后显示效果图
文件:main.cpp
#include "mainwindow.h"
#include
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【0】载入原始图
Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
imshow("original image",srcImage);//显示原始图
Mat dstImage,edge,grayImage;//定义参数
//【1】创建与src同类型和大小的矩阵(dst)
dstImage.create(srcImage.size(),srcImage.type());
//【2】将原图像转换为灰度图像
//此句代码的OpenCV2版为:
//cvtColor(srcImage,grayImage,CV_BGR2GRAY);
//此句代码的OpenCV3版为:
cvtColor(srcImage,grayImage,COLOR_BGR2GRAY);
//【3】先使用5x5内核来降噪
blur(grayImage,edge,Size(5,5));
//【4】运行Canny算子
Canny(edge,edge,3,9,3);
//【5】显示效果图
imshow("Effect picture",edge);
waitKey(0);
return 0;
}
首先,照常载入图像并显示
然后将图像转变成灰度图,保存在grayImage
中
再用blur函数
对grayImage
进行降噪处理(模糊处理),并将结果保存在edge
中
最后,调用Canny函数
对edge进行边缘检测
#include "mainwindow.h"
#include
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】读入视频
VideoCapture capture("E:/StudyDocuments/Study-Documents-2021/Year-2021/Study_Note/Qt/Code/opencv/test2.avi");
if (!capture.isOpened())
{
qDebug()<< "can't open video";
return -1;
}
//【2】虚幻显示每一帧
while (1)
{
//定义一个Mat变量,用于存储每一帧图像
Mat frame;
//读取当前帧
capture>>frame;
//显示当前帧
imshow("1",frame);
//延时30ms
waitKey(30);
}
return 0;
}
代码本身应该是没问题了,但可能是缺少ffmpeg库,也可能是缺少相应的解码器,该问题暂时未解决,先留着,日后返回来再看。
【问题已解决】
问题原因: 缺少ffmpeg的dll文件
详细解释: 在Cmake opencv时,程序无法正确从网上下载下来需要的ffmpeg组件,进而在编译时无法正确安装ffmpeg,从而导致视频文件无法正确读取
解决方法: 在”Qt-OpenCV开发环境搭建(史上最详细)“一文中,问题汇总部分的问题五
#include "mainwindow.h"
#include
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】从摄像头读入视频
VideoCapture capture(0);//此处用0来代表调用摄像头
if (!capture.isOpened())
{
qDebug()<< "can't open video";
return -1;
}
//【2】虚幻显示每一帧
while (1)
{
//定义一个Mat变量,用于存储每一帧图像
Mat frame;
//读取当前帧
capture>>frame;
//显示当前帧
imshow("video",frame);
//延时30ms
waitKey(30);
}
return 0;
}
#include "mainwindow.h"
#include
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//【1】从摄像头读入视频
VideoCapture capture(0);//此处用0来代表调用摄像头
if (!capture.isOpened())
{
qDebug()<< "can't open video";
return -1;
}
Mat edges;
//【2】循环显示每一帧
while (1)
{
//定义一个Mat变量,用于存储每一帧图像
Mat frame;
//读取当前帧
capture>>frame;
//将原图像转换为灰度图像
cvtColor(frame,edges,COLOR_BGR2GRAY);
//使用3x3内核来降噪(2x3+1=7)
blur(edges,edges,Size(7,7));
//进行canny边缘检测
Canny(edges,edges,0,30,3);
//显示当前帧
imshow("Effect video",edges);
//延时30ms
if(waitKey(30) >=0) break;
}
return 0;
}
通过本章学习,我对OpenCV有了一个大概的了解,但同时也发现了,作为不太常见的Qt+OpenCV组合,我也面临着许多无从下手的难题,这意味着我必须更加努力钻研,更多地掌握Qt和OpenCV独有的特性,才能使我在接下来的学习过程中少走弯路。