学习OpenCV 4(一)
系统 | Ubuntu 18.04 |
---|---|
OpenCV 版本 | 4.5.1 |
接口类型 | C++ |
安装OpenCV | 点我安装 |
文章目录
- 0. Ubuntu OpenCV C++ 编译运行示例
- 1. 显示图片
- 2. 修改图像
- 3. 视频
- 4. Canny边缘检测
- 5. 视频Canny边缘检测
- 6. 导出视频Canny边缘检测
0. Ubuntu OpenCV C++ 编译运行示例
C++编译流程
新建文件夹并进入
mkdir ShowImage && ShowImage
- 打开终端,新建
cpp
文件
touch read.cpp
- 编辑
read.cpp
gedit read.cpp
拷入下列代码并保存
#include <opencv2/opencv.hpp>using namespace cv;int main(int argc,char **argv)
{Mat img = imread("girl.jpg");imshow("meinv",img);waitKey(0);
}
- 拷贝
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到(你新建的文件夹) - 修改
CMakeLists.txt
修改前
# Define project name
project(opencv_example_project)# Declare the executable target built from your sources
add_executable(opencv_example example.cpp)# Link your application with OpenCV libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
修改后(其他不要动,仔细对比)
# Define project name
project(text)# Declare the executable target built from your sources
add_executable(text read.cpp)# Link your application with OpenCV libraries
target_link_libraries(text ${OpenCV_LIBS})
拷贝图像
找一张jpg
格式的图像重名为girl
拷贝到ShowImage
文件夹编译运行
cmake .
make
./text
- 报错
注意第3
步和第6
步图像名称 - 参考
1. 显示图片
cv::imread
加载图像文件成为一个Mat对象
参数:
- 图像文件名
- 数值
<0
(IMREAD_UNCHANGED原图
)
0
(IMREAD_GRAYSCLAE灰度图
)
>0
(IMREAD_COLORRGB图
)
//头文件
#include <opencv2/opencv.hpp>//主函数
int main(int argc, char** argv){//读取图片(支持多种格式),返回一个cv::Mat结构(用来处理所有类型的图像)cv::Mat img = cv::imread(argv[1],-1);//如果图片为空(没有载入图片),返回-1if(img.empty()) return -1;//设置窗口cv::namewindow("Examples1", cv::WINDOW_AUTOSIZE);//显示cv::imshow("Example1", img);//<=0,无限等待直到有键按下,>0,等待,继续运行程序(毫秒ms)cv::waitKey(0);//关闭窗口,释放相关联的内存空间cv::destroyWindow("Example1");return 0;
}
OpenCV的函数都在cv空间下,调用OpenCV的函数需要在函数前面加上cv::,这样相当繁琐,我们将使用using namespace cv;
指令告诉编译器所以函数都在cv空间中。但是这和其他命名空间有冲突的风险,如果函数foo()存在于cv和std的命名空间,必须指定是位于cv::foo()的函数,还是std::foo()的函数。
#include <opencv2/highgui/highgui.hpp>using namespace cv;int main(int argc,char** argv){Mat img = imread(argv[1],-1);if(img.empty()) return -1;nameWindiw("Example1",cv::WINDOW_SIZE);imshow("Example1",img);waitKey(0);destroyWindow("Example1");
}
2. 修改图像
cv::cvtColor(img,img_gray,CV_BGR2GRAY)
彩色空间转换
参数:
- 源图像
- 转换后的图像
- 源和目标色彩空间
COLOR_BGR2HLS
(转HLS)
COLOR_BGR2GRAY
(转灰度)
- 新建文件夹并进入
mkdir Gray && Gray
- 打开终端,新建cpp文件
touch gray.cpp
- 编辑gray.cpp
gedit gray.cpp
拷入下列代码并保存
#include <opencv2/opencv.hpp>//
#include <opencv2/imgproc/types_c.h>using namespace cv;int main(int argc, char** argv)
{Mat img = imread("girl.jpg"),img_gray;imshow("girl",img);cvtColor(img,img_gray,CV_BGR2GRAY);imshow("gray",img_gray);imwrite("gray.jpg",img_gray);waitKey(0);
}
- 拷贝
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到Gray
文件夹 - 修改
CMakeLists.txt
修改前
# Define project name
project(opencv_example_project)# Declare the executable target built from your sources
add_executable(opencv_example example.cpp)# Link your application with OpenCV libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
修改后(其他不要动,仔细对比)
# Define project name
project(text)# Declare the executable target built from your sources
add_executable(text gray.cpp)# Link your application with OpenCV libraries
target_link_libraries(text ${OpenCV_LIBS})
拷贝图像
找一张图像重名为girl
拷贝到Gray
文件夹编译运行
cmake .
make
./text
3. 视频
- video.cpp
mkdir Video && cd Video
touch video.cpp && gedit video.cpp
拷贝下列代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <string> //学习OpenCV书中无此行,疑似OpenCV版本问题using namespace std;int main(int argc, char** argv)
{cv::Mat frame;cv::namedWindow("Example3",cv::WINDOW_AUTOSIZE);cv::VideoCapture cap;cap.open(string("girl.mp4"));for(;;){cap >> frame;if(frame.empty()) break;cv::imshow("Example3",frame);if(cv::waitKey(33.3333) >=0 ) break;//每秒30帧,每帧停留33.3333秒}return 0;
}
- 拷贝并修改
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到Video
文件夹
修改前
# Define project name
project(opencv_example_project)# Declare the executable target built from your sources
add_executable(opencv_example example.cpp)# Link your application with OpenCV libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
修改后(其他不要动,仔细对比)
# Define project name
project(text)# Declare the executable target built from your sources
add_executable(text video.cpp)# Link your application with OpenCV libraries
target_link_libraries(text ${OpenCV_LIBS})
拷贝图像
找一张图像重名为video
拷贝到Video
文件夹编译运行
cmake .
make
./text
4. Canny边缘检测
cpp
mkdir Canny边缘检测 && cd Canny边缘检测
touch canny.cpp && gedit canny.cpp
拷贝代码
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>using namespace cv;
int main(int argc, char** argv)
{cv::Mat img = imread("girl.jpg");cv::imshow("girl",img);cvtColor(img,img,CV_BGR2GRAY);//模糊blur(img,img,Size(4,4));cv::Canny(img,img,3,3,3);cv::imshow("Canny",img);cv::imwrite("canny.jpg",img);cv::waitKey(0);
}
- 拷贝并修改
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到Canny边缘检测
文件夹
修改后(其他不要动,仔细对比)
# Declare the executable target built from your sources
add_executable(text canny.cpp)
拷贝视频
找一张图像重名为girl
拷贝到Canny边缘检测
文件夹编译运行
cmake .
make
./text
5. 视频Canny边缘检测
cpp
mkdir 视频Canny边缘检测 && cd 视频Canny边缘检测
touch canny.cpp && gedit canny.cpp
拷贝代码
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>using namespace cv;int main(int argc,char** argv)
{cv::VideoCapture capture("girl.mp4");while(1){Mat frame;capture >> frame;//cv::imshow("girl",frame);cv::cvtColor(frame,frame,CV_BGR2GRAY);cv::blur(frame,frame,Size(4,4));cv::Canny(frame,frame,3,60,3);cv::imshow("Canny",frame);//cv::waitKey(0);if(cv::waitKey(33) >= 0) break;}return 0;
}
}
- 拷贝并修改
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到视频Canny边缘检测
文件夹
修改后(其他不要动,仔细对比)
# Declare the executable target built from your sources
add_executable(text canny.cpp)
拷贝视频
找一个mp4格式的视频并重名为girl
拷贝到视频Canny边缘检测
文件夹编译运行
cmake .
make
./text
6. 导出视频Canny边缘检测
cpp
mkdir 导出视频Canny边缘检测 && cd 导出视频Canny边缘检测
touch canny.cpp && gedit canny.cpp
拷贝代码
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <iostream>using namespace cv;int main(int argc,char** argv)
{//读取cv::VideoCapture capture("girl.mp4");double fps = capture.get(cv::CAP_PROP_FPS);cv::Size size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH),(int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));//写入cv::VideoWriter writer; //仅支持avi格式//opencv3为CV_FOURCC(),opencv4为VideoWriter::fourcc() //灰度图参数isColor设为false(默认为true) writer.open("bgirl.avi",VideoWriter::fourcc('M','J','P','G'),fps,size,false);cv::Mat frame;for(;;){capture >> frame;if(frame.empty())break;//帧数据为空,跳出cv::cvtColor(frame,frame,CV_BGR2GRAY);//转灰度cv::blur(frame,frame,Size(4,4));//模糊cv::Canny(frame,frame,3,60,3);cv::imshow("Canny",frame);//显示帧cv::waitKey(1000/fps);//每帧停留时间//写入帧writer << frame;}//释放内存capture.release();writer.release();
}
- 拷贝并修改
CMakeLists.txt
将../opencv-4.5.1/samples/cpp/example_cmake
中的CMakeLists.txt
拷贝到导出视频Canny边缘检测
文件夹
修改后(其他不要动,仔细对比)
# Declare the executable target built from your sources
add_executable(text canny.cpp)
拷贝视频
找一个mp4格式的视频并重名为girl
拷贝到导出视频Canny边缘检测
文件夹编译运行
cmake .
make
./text
- Ubuntu下C++ opencv详细教程,句句注释
- C++ OpenCV cvtColor CV_BGR2GRAY未声明的标识符的解决办法(四)
- OpenCV4 error: ‘CV_CAP_PROP_FRAME_WIDTH’ was not declared in this scope
- OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui
学习OpenCV 4(一)相关推荐
- 快速系统从零学习OpenCV 4路线图
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转眼间,小白学视觉就要成立三周年了,小白一直是很感谢小伙伴们的支持 ...
- 【从零学习OpenCV 4】4种读取Mat类元素的的方法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】Mat类构造与赋值
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】Mat类介绍
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】安装过程中问题解决方案
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】了解OpenCV的模块架构
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】Image Watch插件的使用
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV 4】opencv_contrib扩展模块的安装
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- 【从零学习openCV】IOS7下的人脸检測
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
最新文章
- Serverless 下的微服务实践
- 基于TensorFlow的简单验证码识别
- 特征因子是什么意思_生态因子作用的一般特征
- 萧县机器人_全国总决赛第一名!萧县杨楼的这位学生厉害了
- 多数据源处理-苞米豆-dynamic
- 最前线 | 斗鱼一季度月活用户超虎牙,但上市时间仍不明确
- springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
- java基础-冒泡排序
- VS2010远程调试
- 基于近邻法的分类器设计
- Windows/Mac系统MySQL,MySQL驱动下载和安装
- 使用SSH连接linux服务器重启Tomcat服务
- mBlock机器人组装教程_mbot机器人如何搭建?mBot机器人套件快速搭建指南
- lisp绘制直齿圆柱齿轮_直齿圆柱齿轮的画法
- rar压缩包密码解密
- 软件著作权申报中60页标准代码文档
- 从零开始学习ThingJS之创建/销毁物体
- 文件不小心删除了怎么恢复呢,怎么恢复误删除的文件
- Ubuntu配置locale
- sparksql-分组月度环比同比自动化
热门文章
- tekla钢结构算量_钢结构、Tekla及建筑工业化厂商对Tekla软件的开发和应用
- 基于HTML5的电子病历编辑方法及系统与流程
- idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案
- 企业微信与视频号裂变如何做私域运营?
- php通讯hpsocket,HP-Socket 远程通信 服务端 客户端 源码
- matlab非参数功率普估计,【数字信号处理】--功率谱估计
- Hadoop原理讲解(面试题)
- java海康摄像头添加人脸_java调用海康人脸识别机5603的sdk的使用总结(二)
- Scara机器人正逆运动学分析
- 商务与经济统计阅读笔记2