第一件事:简单程序上手
1. 第一个程序:图像显示
图像显示过程十分简单,只需 imread 函数载入图像到数据结构 Mat 类中,然后 imshow 函数显示即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::Mat img = cv::imread("1.jpg"); //imread 载入图片
cv::imshow("载入的图片", img); //imshow 展示图片
cv::waitKey(0); //等待任意键按下
return 0;
}
放置一张图片,并改名为程序中的 1.jpg 之后,运行程序。
2. 第二个程序:图像腐蚀
基本图形学运算之一,用图片中暗的部分 腐蚀 掉图片中亮的部分。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//载入原图
cv::Mat srcImg = cv::imread("1.jpg");
cv::imshow("【原图】腐蚀", srcImg);
//进行腐蚀操作
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15,15));
cv::Mat dstImg;
cv::erode(srcImg, dstImg, element);
//按下任意键后继续
cv::waitKey();
//显示效果图
cv::imshow("【效果图】腐蚀", dstImg);
cv::waitKey();
return 0;
}
程序首先载入名称为 1.jpg 的图片并显示,之后通过 getStructuringElement 函数生成一个指定形状和尺寸的结构元素(内核矩阵)。接着调用 erode 函数进行腐蚀操作,最后将结果矩阵显示。
3. 第三个程序:模糊
对图像进行均值滤波操作,达到模糊效果。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//加载原图并显示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原图】均值滤波", srcImage);
//按下任意键继续
cv::waitKey();
//均值滤波操作
cv::Mat dstImage;
cv::blur(srcImage, dstImage, cv::Size(21,21));
//显示结果图
cv::imshow("【效果图】均值滤波", dstImage);
cv::waitKey();
return 0;
}
程序依然载入一张名为 1.jpg 的图片并显示,之后调用一次 blur 函数生成结果矩阵并显示。
4. 第四个程序:边缘检测
运用 canny 函数进行边缘检测。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//载入原图并显示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原图】边缘", srcImage);
//按任意键继续
cv::waitKey();
//转化灰度矩阵
cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);
//降噪
cv::blur(grayImage, edge, cv::Size(3,3));
//canny算子
cv::Canny(edge, edge, 3, 9,3);
//展示效果图
cv::imshow("【效果图】边缘", edge);
cv::waitKey();
return 0;
}
程序首先载入图像,并转换成灰度图,再用 blur 函数进行降噪,最后用 canny 函数进行边缘检测并显示。
四个简单的小程序,初窥 OpenCV 。
第二件事:基本视频操作
主要是通过 VideoCapture 类来对视频进行读取和显示。
1. 读取并播放视频
首先初始化一个 VideoCapture 变量,然后循环读取每一帧并显示。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open("1.mp4");
//或构造函数初始化
//cv::VideoCapture capture("1.mp4");
//循环显示每一帧
while (1) {
//定义 Mat 变量
cv::Mat frame;
//输出一帧到 frame 中
capture>>frame;
//显示当前帧
cv::imshow("视频", frame);
//延迟30ms
cv::waitKey(30);
}
return 0;
}
2. 调用摄像头采集图像
我们只需要将上述代码中的 "1.mp4" 替换成 0 即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或构造函数初始化
//cv::VideoCapture capture(0);
//循环显示每一帧
while (1) {
//定义 Mat 变量
cv::Mat frame;
//输出一帧到 frame 中
capture>>frame;
//显示当前帧
cv::imshow("视频", frame);
//延迟30ms
cv::waitKey(30);
}
return 0;
}
3. 在视频上加一些处理
对每一帧进行边缘检测之后再显示即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或构造函数初始化
//cv::VideoCapture capture(0);
//循环显示每一帧
while (1) {
//定义 Mat 变量
cv::Mat frame;
//输出一帧到 frame 中
capture>>frame;
//边缘检测
cv::Mat edge,grayImg;
cv::cvtColor(frame, grayImg, cv::COLOR_BGR2GRAY);
cv::blur(grayImg, edge, cv::Size(3,3));
cv::Canny(edge, edge, 3, 9, 3);
//显示效果图
cv::imshow("边缘", edge);
//延迟30ms
cv::waitKey(30);
}
return 0;
}
第三件事:生成Xcode项目,查看并编译 OpenCV 源码
在之前下载的 OpenCV 中并不包含源码,所以需要下载 OpenCV 完整源码,并通过 cmake(开源并且跨平台的安装编译工具) 来生成 Xcode 项目。通过 Xcode 可以方便的对源代码进行查看、更改及编译。
1. 下载 OpenCV 完整源码
2. 生成 Xcode 项目
下载之后首先解压缩,并在 OpenCV-x.x.x 目录下创建 xcode 文件夹,打开 mac 的终端,cd 命令进入刚刚创建的 xcode 目录执行如下命令(这里就用到了之前下载的cmake)。
cmake -G "Xcode" ..
耐心等待..
完成之后,进入 xcode 目录,找到 .xcodeproj 文件并打开。
在工程目录下就可以选择一个感兴趣的项目查看其源码,比如 opencv_core 模块,打开 modules/opencv_core/Src/matrix.cpp 查看源代码。
3. 编译工程
Xcode 中 "command" + "R" 组合键,可直接进行编译,默认是 ALL_BUILD 启动项,即编译所有模块。可更改启动项,只编译部分模块。如下图:
编译成功之后会在工程目录 lib/debug 目录下生成本次编译的 OpenCV 依赖库,可供以后使用。