Ubuntu_Anaconda_opencv4.5.3_opencv_contrib4.5.3_libtorch1.8.1安装配置之三-配置opencv和libtorch

ubuntu16.04_libtorch1.8.1_opencv4.5.3


1.libtorch+opencv示例

#include <iostream>
#include "torch/script.h"
#include "torch/torch.h"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include <opencv2/imgproc/types_c.h>
#include <vector>

int main()
{
    /* 配置参数 */
    std::vector <float> mean_ = {0.485, 0.456, 0.406};
    std::vector <float> std_ = {0.229, 0.224, 0.225};
    char path[] = "1.jpg";

    // 读取图片
    cv::Mat image = cv::imread(path);
    if (image.empty())
        fprintf(stderr, "Can not load image\n");

    // 转换通道,
    cv::cvtColor(image, image, CV_BGR2RGB);
    cv::Mat img_float;
    image.convertTo(img_float, CV_32F, 1.0 / 255);

    // resize, 测试一个点数据
    cv::resize(img_float, img_float, cv::Size(256, 128));
    //std::cout << img_float.at<cv::Vec3f>(256, 128)[1] << std::endl;

    // 转换成tensor
    auto img_tensor = torch::from_blob(img_float.data, {1, 3, 256, 128}, torch::kFloat32);
    //img_tensor = img_tensor.permute({0,3,1,2});
    // tensor标准化
    for (int i = 0; i < 3; i++) {
        img_tensor[0][0] = img_tensor[0][0].sub_(mean_[i]).div_(std_[i]);
    }

    // // 构造input
    // //auto img_var = torch::autograd::make_variable(img_tensor, false); //tensor->variable会报错
    // std::vector<torch::jit::IValue> inputs;
    // inputs.emplace_back(img_tensor); //向容器中加入新的元素, 右值引用

    // //加载pytorch模型
    // //std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../model/model_int.pt");
    // torch::jit::script::Module module = torch::jit::load("../xxx.pt");
    // assert(module != nullptr);

    // //前向
    // //at::Tensor output_image = module->forward(inputs).toTensor();
    // at::Tensor output_image = forward(inputs).toTensor();
    // std::cout << output_image;
     //std::cout << img_tensor;


    return 0;
}

cv::Mat convertTo3Channels(cv::Mat binImg)
{
    cv::Mat three_channel = cv::Mat::zeros(binImg.rows, binImg.cols, CV_8UC3);
    std::vector<cv::Mat> channels;
    for (int i=0;i<3;i++)
    {
        channels.push_back(binImg);
    }
    merge(channels, three_channel);
    return three_channel;
}

2.对应CMakelist.txt文件:

cmake_minimum_required(VERSION 3.0)

# Define project name
project(opencv_example_project)

find_package(Torch REQUIRED)
find_package(OpenCV  REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
# 包含头文件include
include_directories(${OpenCV_INCLUDE_DIRS} ${TORCH_INCLUDE_DIRS})


# 生成的目标文件(可执行文件)
add_executable(main main.cpp)

# 置需要的库文件lib
# set(OpenCV_LIBS opencv_core  opencv_highgui opencv_imgcodecs opencv_imgproc)
target_link_libraries(main  ${OpenCV_LIBS} ${TORCH_LIBRARIES}) #
set_property(TARGET main PROPERTY CXX_STANDARD 14)

3.使用cmake编译

在项目文件夹新建build文件。
执行cmake命令编译:

#cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch ..
$ cmake -DCMAKE_PREFIX_PATH=/XXXX/libtorch ..

注意:此处需要改成自己相应的libtorch的路径
编译完成后,执行:
make
命令。
好的,完成。

注意:
问题1、

如果出现以下错误的情况,进行如下修改:
error: conversion from ‘torch::jit::Module’ to non-scalar type ‘std::shared_ptrtorch::jit::Module’ requested
std::shared_ptrtorch::jit::script::Module module = torch::jit::load("…/model/model_int.pt");
在这里插入图片描述

std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../xxx.pt");`

std::shared_ptr这个是libtorch测试版本使用的变量类型,现在已经变更,将以上代码修改为:

 torch::jit::script::Module module = torch::jit::load("../xxx.pt");

把下面代码

 at::Tensor output_image = module->forward(inputs).toTensor();

修改为

 torch::Tensor output = module.forward(std::move(inputs)).toTensor();

问题2、
如果不在.cpp文件下加入:
#include <opencv2/imgproc/types_c.h>
头文件,会出现以下错误:
error: ‘CV_BGR2RGB’ was not declared in this scope

问题3、
在CMakelist.txt文件末尾必须有该句话:

set_property(TARGET main PROPERTY CXX_STANDARD 14)

否则出现的错误如下:
error: no matching function for call to ‘at::Tensor::to(const c10::Device&) const’

参考链接:
https://www.cnblogs.com/geoffreyone/p/10827010.html
https://blog.csdn.net/Qin1999/article/details/89578589
https://blog.csdn.net/u010654302/article/details/105516456/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值