C++

tech2022-09-15  80

使用纯C++代码显示图片及处理等觉得太繁琐了,就决定通过调用opencv库来进行图像显示及处理,所以也讲下opencv的下载安装。

一、opencv安装

1、可以就直接到OpenCV官网下载(https://opencv.org/),点击RELEASES选择所需要的版本,我下载的是OpenCV-4.4.0 Windows版本的。下载后双击解压,解压完得到opencv文件夹,其中build是使用OpenCV时要用到的一些库文件,而sources中则是OpenCV官方为我们提供的一些demo示例源码。 2、接着要配置环境变量,依次选择计算机->属性->高级系统设置->环境变量,找到Path变量,选中并点击编辑,把OpenCV执行文件的路径(D:\ruan\opencv\build\x64\vc15\bin)添加进去,执行文件的路径通过OpenCV文件夹内依次选择build->x64->vc15->bin来复制粘贴。 3、最后在Visual Studio中部署OpenCV,首先添加包含目录;依次选择项目->属性->VC++目录->包含目录->编辑,找到opencv的包含目录添加,我添加的是:D:\ruan\opencv\build\include,D:\ruan\opencv\build\include\opencv2;接着添加库目录:依次选择项目->属性->VC++目录->库目录->编辑,我添加的是D:\ruan\opencv\build\x64\vc15\lib;最后添加附加依赖项:依次选择项目—>属性—>链接器—>输入—>附加依赖项—>编辑,添加库文件名,有两个文件opencv_world341d.lib和opencv_world341.lib,如果配置为Debug,添加opencv_world341d.lib;如果为Release,添加opencv_world341.lib。 PS:设置好之后我发现这个应该只能在项目里适用,也就是新建了项目之后还需要再重新进行相关配置,这样就比较麻烦,所以依次选择菜单栏上的视图->其他窗口->属性管理器->Debug|X64->右键Microsoft.Cpp.x64.user->属性,进行包含目录,库目录及附加依赖项的配置。由于编译时只用到了debug,release是发布程序时才会用到,Release|X64的配置为可选项,也可以不配置。

二、显示图像

先使用imread函数将图像载入到图像存储数据结构Mat类中,然后使用imshow函数将图像显示即可。 代码如下:

#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; //包含cv命名空间 int main() { Mat srcImage = imread("D:\\ygs\\lena.png"); //通过文件路径载入图像 if (!srcImage.data)//判断文件是否读入正确 return 1; imshow("【原始图】", srcImage); //显示图像 waitKey(0); //等待任意按键按下 return 0; }

PS:将环境切换到Release时,出现报错:error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead.出现这个错误时,是因为strcpy函数不安全造成的溢出。解决方法是:依次选择项目->属性->C+±>预处理器,在预处理器中加入一段代码:_CRT_SECURE_NO_WARNINGS。

三、调用相机

我用的是basler的usb相机,所以要下载它的软件驱动,里面就已经包含SDK库,注意安装时要选择developer,并且选中gige和usb。 安装驱动后,可以在安装位置看到下面这些文件,重点是Development文件夹,它含有include和lib,这就是opencv调用的包含目录,库目录和附加依赖项。 接下来,就需要在项目里添加包含目录,库目录和依赖项,依赖项我是把lib文件都添加进去了,并且需要把这些lib文件复制到opencv文件夹相应lib文件位置处。 代码如下:

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> //using namespace cv; //basler相机 #include <pylon\PylonIncludes.h> #include <pylon\PylonGUIIncludes.h> using namespace Pylon; int main() { cv::VideoCapture capture(0); if (!capture.isOpened()) { printf("Open camera is failed!"); system("pause"); return -1; } //设置摄像头的拍摄属性为分辨率1280x1024,帧率30fps capture.set(cv::CAP_PROP_FRAME_HEIGHT, 1024); capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280); capture.set(cv::CAP_PROP_FPS, 30.0); capture.set(cv::CAP_PROP_FOURCC, -1); //double fps = capture.get(cv::CAP_PROP_FPS);//获得帧率 //int fourcc = capture.get(cv::CAP_PROP_FOURCC); //cv::VideoWriter outputVideo("D:\\ygs\\fuse\\DD.avi", outCompressCodec, 25.0, cv::Size(1280, 1024), true); cv::VideoWriter outputVideo; int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G'); outputVideo.open("D:\\ygs\\fuse\\DDt.avi", codec, 30.0, cv::Size(1280, 1024), true);//灰度false while (capture.isOpened()) { cv::Mat frame, grayImage, filterImage; if ((frame.rows != 0) || (frame.cols != 0)) { printf("frame capture failed!\n"); system("pause"); exit(0); } capture >> frame; //图像处理 int Row = frame.rows;//行 int Col = frame.cols; int numChannel = frame.channels(); /*//灰度化 //Mat grayImage = imread("D:\\ygs\\csdn.jpg", 0); //first参数0为灰度,1为彩色 cvtColor(frame, grayImage, cv::COLOR_BGR2GRAY);//second //均值滤波 blur(grayImage, filterImage, cv::Size(7, 7), cv::Point(-1, -1));*/ filterImage = frame; outputVideo << filterImage; imshow("VideoPlay", filterImage); if (char(cv::waitKey(1)) == 'q') { capture.release(); outputVideo.release(); exit(0); } } }

PS:如果出现"ACCESS_MASK"不明确这种错误,就需要将using namespace cv;去掉,在相应代码前添加cv::,在写C++&opencv程序时,就尽量不用using namespace 命名空间,以免产生命名空间之间的冲突。

最新回复(0)