18、window10+Clion2022+minGW编译opencv4.4.0+opencv_contrib4.4.0并测试
基本思想:在window10想配置一下opencv4.4.0,同时导入clion2020.1中使用,逐记录一下;首先下载minGW工具和opencv4.4.0源码minGW:可以自行下载https://sourceforge.net/projects/mingw-w64/files/?source=navbar;建议使用window10 自带的linux 内核下载离线安装包, 这样比较快~axel
基本思想:在window10想配置一下opencv4.4.0,同时导入clion2020.1中使用,逐记录一下;
第一步:配置MinGW开发工具链
方法一、首先下载minGW工具和opencv4.4.0源码 该工程:https://github.com/sxj731533730/MingwOpencv440.git
minGW:可以自行下载MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net; 建议使用window10 自带的linux 内核下载离线安装包, 这样比较快~
axel -n 100 https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-posix/sjlj/x86_64-7.3.0-release-posix-sjlj-rt_v5-rev0.7z
这个地方一定要注意 下载sjlj 不要用seh版本,因为sjlj版本是支持x86 和x86_64的编译,而sjlj只支持x86_64的编译,后续可能编译ffmpeg 可能需要支持这方面的操作~
方法二、也可以使用msys2中mingw64位工具,虽然本博客用的第一种方法,但是建议用这种mingw64进行编译相关库和使用
https://github.com/msys2/msys2-installer/releases/download/2022-03-19/msys2-x86_64-20220319.exe
安装到D:/msys2,然后刷新一下源
https://mirrors.tuna.tsinghua.edu.cn/help/msys2/
配置源
Administrator@sxj731533730 MSYS ~
# pacman -S mingw-w64-x86_64-toolchain
# pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-extra-cmake-modules
# pacman -S mingw-w64-x86_64-make
# pacman -S mingw-w64-x86_64-gdb
# pacman -S mingw-w64-x86_64-toolchain
# pacman -S diffutils
然后将D:\msys64\mingw64\bin 添加到环境变量中,
注意:将D:\msys64\mingw64\include拷贝到D:\msys64\mingw64\x86_64-w64-mingw32中,否则clion使用存在问题
本博客使用的第一种方法
提供百度链接:https://pan.baidu.com/s/13pywLz_m3kcbvxPt9shx4A
提取码:um19
第二步:然后从F盘解压之后到D盘的目录, 填入到window10的系统变量(用户和系统变量我都添加了)
配置成功将在cmd显示gcc -v 信息
然后安装Cmake-gui: CMake 自行安装,安装成功将在cmd显示
然后下载opencv4.4.0源码,或者使用window10 自带的linux 内核下载
axel -n 100 https://jaist.dl.sourceforge.net/project/opencvlibrary/4.4.0/opencv-4.4.0-vc14_vc15.exe
然后解压文件夹到对应的盘符下;
然后在盘符下建立一个文件夹buildGW
ubuntu@DESKTOP-L50FRR6:/mnt/d/Opencv440$ tree -L 1
.
├── LICENSE.txt
├── LICENSE_FFMPEG.txt
├── README.md.txt
├── build
├── buildMinGW
└── sources
3 directories, 3 files
最后配置cmake-gui进行编译opencv4.4.0
注意三点 (1)配置图 (2) 选项图 (3)添加变量图 (4) 修改源码图
(1)配置图
D:/Program Files (x86)/minGW64/bin/x86_64-w64-mingw32-gcc.exe
D:/Program Files (x86)/minGW64/bin/x86_64-w64-mingw32-g++.exe
D:/Program Files (x86)/minGW64/bin/x86_64-w64-mingw32-gfortran.exe
如果遇到这个错误
CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles". CMAKE_MAK
点击右上角的advance选项
CMAKE_MAKE_PROGRAM
添加
D:/Program Files (x86)/minGW64/bin/make.exe
(2) 选项图
(3)添加变量图 OPENCV_VS_VERSIONINFO_SKIP=1
(4)修改源码
然后就可以执行make-gui --->configure--->generate ,之后再命令行执行(可以使用下面的命令直接cmake进行编译)
D:\Opencv440\buildMinGW>cmake -G"MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=%cd%/install -DOPENCV_VS_VERSIONINFO_SKIP=ON -DOPENCV_ENABLE_ALLOCATOR_STATS=OFF -DENABLE_PRECOMPILED_HEADERS=OFF ../sources/
D:\Opencv440\buildMinGW>mingw32-make -j8 # 多线程有错误的话,在单线程编译一下,可能就没有错误了
D:\Opencv440\buildMinGW>mingw32-make install
然后opencv4.4.0就安装成功之后,继续填入opencv4.4.0的bin路径的环境变量到window10中 (用户和系统我都添加了)
然后将源码中的D:\Opencv440\build\bin\ opencv_videoio_ffmpeg440_64.dll 拷贝到D:\Opencv440\buildMinGW\bin 下 即可使用;
注(build目录可以删掉了,若果不用vs调用opencv的话,是无用的~~~)
CMakeList.txt文件为
cmake_minimum_required(VERSION 3.6)
project(untitled2)#改为自己的项目名称
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
# Where to find CMake modules and OpenCV
set(OpenCV_DIR "D:\\Opencv440\\buildMinGW")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(untitled2 main.cpp)#当前项目名称和cpp的名称
# add libs you need
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
# linking
target_link_libraries(untitled2 ${OpenCV_LIBS})
设置运行环境变量
c++ 代码为
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
int main() {
cv::VideoCapture capture(0);
if (!capture.isOpened()) {
std::cout << "open camera error!" << std::endl;
return -1;
}
cv::Mat frame;
while (1) {
capture >> frame;
if (frame.empty()) {
std::cout << "capture empty frame" << std::endl;
continue;
}
cv::Mat shrink_frame;
cv::resize(frame, shrink_frame,
cv::Size(frame.cols / 2, frame.rows / 2),
0, 0, 3);
cv::imshow("detect", shrink_frame);
int key = cv::waitKey(1);
if (key == 'q') {
break;
}
}
return 0;
}
调用成功,( 哈哈哈)
测试二 保存视频
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main() {
//读取视频或摄像头
VideoCapture cap(0);
//计算视频帧数
Mat frame;
cap >> frame;
int VedioFPS = cap.get(cv::CAP_PROP_FPS);
VedioFPS=VedioFPS!=0?VedioFPS:25;
cv::VideoWriter video("human_save.avi", cv::VideoWriter::fourcc('M','J','P','G'), VedioFPS,
cv::Size(static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH)),static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT))));
if (!cap.isOpened())
{
cout << "Error opening video stream or file" << endl;
return -1;
}
while (true) {
// Capture frame-by-frame
cap >> frame;
if (frame.empty()) break;
imshow("frame", frame);
video.write(frame);
std::cout<<"write video"<<std::endl;
char c = (char)waitKey(1);
if (c == 27)
break;
}
cap.release();
destroyAllWindows();
video.release();
return 0;
}
如果想编译附加库opencv_contrib4.4.0 编译过程中需要下载一些东西,网不好的话,可以把这个百度链接下的downloads.rar压缩包提前解压放在buildMinGWContrib所在的目录中
链接:https://pan.baidu.com/s/1Lq6O_cTqZAMQoiBGCvjhzA
提取码:4nhp
D:\Opencv440>git clone https://github.com/opencv/opencv_contrib
Cloning into 'opencv_contrib'...
remote: Enumerating objects: 36535, done.
remote: Counting objects: 100% (185/185), done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 36535 (delta 76), reused 133 (delta 45), pack-reused 36350 eceiving objects: 100% (36535/36535), 132.01 MiReceiving objects: 100% (36535/36535), 132.24 MiB | 476.00 KiB/s, done.
Resolving deltas: 100% (22645/22645), done.
Updating files: 100% (3035/3035), done.
D:\Opencv440>cd opencv_contrib
D:\Opencv440\opencv_contrib>git branch
* 4.x
D:\Opencv440\opencv_contrib>git chechout 4.4.0
D:\Opencv440\opencv_contrib>git branch
* 4.4.0
4.x
D:\Opencv440\buildMinGWContrib>cmake -G"MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=%cd%/install -DOPENCV_VS_VERSIONINFO_SKIP=ON -DOPENCV_ENABLE_ALLOCATOR_STATS=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -DOPENCV_ENABLE_NONFREE=ON -DBUILD_opencv_python3=OFF ../sources/
D:\Opencv440\buildMinGWContrib>mingw32-make -j8
[ 99%] [ 99%] Built target opencv_test_optflow
Built target opencv_perf_gapi
[ 99%] Built target opencv_test_gapi
[ 99%] Built target opencv_perf_optflow
[100%] Built target opencv_perf_stitching
[100%] Built target opencv_test_stitching
[100%] Built target opencv_test_stereo
[100%] Built target opencv_superres
[100%] Built target opencv_perf_stereo
[100%] Built target opencv_test_superres
[100%] Built target opencv_perf_superres
D:\Opencv440\buildMinGWContrib>mingw32-make install
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/etc/lbpcascades/lbpcascade_frontalface.xml
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/etc/lbpcascades/lbpcascade_frontalface_improved.xml
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/etc/lbpcascades/lbpcascade_profileface.xml
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/etc/lbpcascades/lbpcascade_silverware.xml
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/x64/mingw/bin/opencv_annotation.exe
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/x64/mingw/bin/opencv_visualisation.exe
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/x64/mingw/bin/opencv_interactive-calibration.exe
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/x64/mingw/bin/opencv_version.exe
-- Up-to-date: D:/Opencv440/buildMinGWContrib/install/x64/mingw/bin/opencv_version_win32.exe
cmakelists.txt
cmake_minimum_required(VERSION 3.16)
project(untitled10)
set(OpenCV_DIR "D:\\Opencv440\\buildMinGWContrib")#改为mingw-bulid的位置
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
find_package(OpenCV REQUIRED)
set(CMAKE_CXX_STANDARD 14)
add_executable(untitled10 main.cpp)
target_link_libraries(untitled10 ${OpenCV_LIBS} )
源码测试一下库是否可用(忘记抄的谁的代码了,测试一下库)
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("F:\\untitled10\\src.png",0);
Mat temp = imread("F:\\untitled10\\chessman.png",0);
if (src.empty() || temp.empty()) {
printf("could not load image...\n");
return -1;
}
imshow("input image", src);
// SURF特征点检测
int minHessian = 400;
Ptr<SURF> detector = SURF::create(minHessian, 4, 3, true, true);//创建一个surf类检测器对象并初始化
vector<KeyPoint> keypoints1, keypoints2;
Mat src_vector, temp_vector;//用来存放特征点的描述向量
//detector->detect(src, keypoints1, Mat());//找出关键点
//detector->detect(temp, keypoints2, Mat());//找出关键点
//找到特征点并计算特征描述子(向量)
detector->detectAndCompute(src, Mat(), keypoints1, src_vector);//输入图像,输入掩码,输入特征点,输出Mat,存放所有特征点的描述向量
detector->detectAndCompute(temp, Mat(), keypoints2, temp_vector);//这个Mat行数为特征点的个数,列数为每个特征向量的尺寸,SURF是64(维)
//匹配
FlannBasedMatcher matcher; //实例化一个FLANN匹配器(括号里可以选择匹配方法)
vector<DMatch> matches; //DMatch是用来描述匹配好的一对特征点的类,包含这两个点之间的匹配信息
//比如左图有个特征m,它和右图的特征点n最匹配,这个DMatch就记录它俩最匹配,并且还记录m和n的
//特征向量的距离和其他信息,这个距离在后面用来做筛选
matcher.match(src_vector, temp_vector, matches); //匹配,数据来源是特征向量,结果存放在DMatch类型里面
//求最小最大距离
double minDistance = 1000;//反向逼近
double maxDistance = 0;
for (int i=0; i< src_vector.rows; i++) {
double distance = matches[i].distance;
if (distance > maxDistance) {
maxDistance = distance;
}
if (distance < minDistance) {
minDistance = distance;
}
}
printf("max distance : %f\n", maxDistance);
printf("min distance : %f\n", minDistance);
//筛选较好的匹配点
vector< DMatch > good_matches;
for (int i = 0; i < src_vector.rows; i++) {
double distance = matches[i].distance;
if (distance < max(minDistance * 2, 0.02)) {
good_matches.push_back(matches[i]);//距离小于范围的压入新的DMatch
}
}
/*//sort函数对数据进行升序排列
//筛选匹配点,根据match里面特征对的距离从小到大排序
//筛选出最优的50个匹配点(可以不使用,会画出所有特征点)
sort(matches.begin(), matches.end());
vector< DMatch > good_matches;
int ptsPairs = std::min(50, (int)(matches.size() * 0.15));//匹配点数量不大于50
cout << ptsPairs << endl;
for (int i = 0; i < ptsPairs; i++)
{
good_matches.push_back(matches[i]);//距离最小的50个压入新的DMatch
}
*/
Mat MatchesImage; //drawMatches这个函数直接画出摆在一起的图
drawMatches(src, keypoints1, temp, keypoints2, good_matches, MatchesImage, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); //绘制匹配点
imshow("FLANN Image", MatchesImage);
waitKey(0);
return 0;
}
配置一下变量
测试结果
F:\untitled10\cmake-build-debug\untitled10.exe
max distance : 1.327715
min distance : 0.092972
测试结果图
更多推荐
所有评论(0)