基本思想:在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

 测试结果图

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐