OpenCV 4.10 windows 上编译并上传conan

目录

一. 上传opencv 预编译包

二. 自己手动写一个测试包并上传

三. 自己写一个app, 引用包


一. 上传opencv 预编译包

1. 下载Opencv, 并用cmake 打开

打开工程之后,编译,install, 目录如下

2. 准备conan 包

把Debug 和 Release 分开放

3. 然后执行如下命令创建本地的包
conan create . --user=moz  --channel=stable -s build_type=Debug
conan create . --user=moz  --channel=stable -s build_type=Release
4. 上传包到remote
conan upload opencv -r=moz_stable

二. 自己手动写一个测试包并上传

1).用如下命令生成一个包

conan new cmake_lib -d name=lib_example -d version=1.0

2). 修改代码

然后在test_package中调用

代码写完之后,修改conanfile.py

然后执行

conan create . --user=moz  --channel=stable -s build_type=Debug

执行上述命令的时候,报如下错误:

-- Configuring done (2.1s)
CMake Error in CMakeLists.txt:IMPORTED_IMPLIB not set for imported target "opencv_calib3d" configuration"MinSizeRel".CMake Error in CMakeLists.txt:IMPORTED_IMPLIB not set for imported target "opencv_core" configuration"MinSizeRel".CMake Error in CMakeLists.txt:IMPORTED_IMPLIB not set for imported target "opencv_dnn" configuration"MinSizeRel".

原因: OpenCV 自己的bug

解决办法: 需要在example 的CMakeLists find_package(opencv) 之前,添加如下代码:

set(OPENCV_MAP_IMPORTED_CONFIG "")

 然后再执行上述命令,就顺利完成了

conan create . --user=moz  --channel=stable -s build_type=Release 

然后上传

 conan upload lib_example  -r=moz_stable

三. 自己写一个app, 引用包

1. 写conanfile.py

import osfrom conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDepsclass TestRecipe(ConanFile):settings = "os", "compiler", "build_type", "arch"name = "opencv_test"version = "1.0"package_type = "application"# generators = "CMakeToolchain", "CMakeDeps"def requirements(self):self.requires("opencv/4.10.0@moz/stable")def generate(self):deps = CMakeDeps(self)deps.generate()tc = CMakeToolchain(self)tc.generate()def build(self):cmake = CMake(self)cmake.configure()cmake.build()def package(self):cmake = CMake(self)cmake.install()

2. 准备 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)project(opencv_test LANGUAGES CXX)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#list(APPEND CMAKE_PREFIX_PATH "C:\\Qt5.15\\5.15.2\\msvc2019_64")message("-----CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")set(OPENCV_MAP_IMPORTED_CONFIG "")
find_package(OpenCV REQUIRED)message(${OpenCV_INCLUDE_DIRS})
#message(${OpenCV_LIBRARY_DIRS})
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIBRARY_DIRS})add_executable(opencv_test main.cpp)
target_link_libraries(opencv_test ${OpenCV_LIBRARIES})install(TARGETS opencv_testLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

3. 写一个demo app


#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;using namespace cv;Mat img;
Mat lab_img;
int l_value = 100, a_value = 128, b_value = 128;
int max_lvalue = 200;
int max_avalue = 255;
int max_bvalue = 255;void onTrackbarChange(int, void*) {Mat disp_img;lab_img.copyTo(disp_img);// forEach// 指针for (int i = 0; i < lab_img.rows; ++i) {for (int j = 0; j < lab_img.cols; ++j) {Vec3b& color = disp_img.at<Vec3b>(i, j);int L = color[0];int a = color[1] - 128;int b = color[2] - 128;L = L + l_value  - 100;a = a + a_value - 128 ;b = b + b_value - 128;L = std::max(0.0, std::min(255.0, L*1.0));a = std::max(-128.0, std::min(127.0, a*1.0));b = std::max(-128.0, std::min(127.0, b*1.0));color[0] = L ;color[1] = a + 128 ;color[2] = b + 128;}}cvtColor(disp_img, disp_img, COLOR_Lab2BGR);imshow("Lab Color", disp_img);
}void onMouse(int event, int x, int y, int flags, void* param) {if (event == EVENT_LBUTTONUP) {Vec3b color = lab_img.at<Vec3b>(y, x);double l = color[0];double a = color[1];double b = color[2];std::cout << "L=" << l << ", a=" << a << ", b=" << b << std::endl;}
}int main() {img = imread("test.png");if (img.empty()) {std::cout << "Please input correct image path." << std::endl;return -1;}namedWindow("Lab Color", WINDOW_NORMAL);setMouseCallback("Lab Color", onMouse);cvtColor(img, lab_img, COLOR_BGR2Lab);createTrackbar("L Value", "Lab Color", &l_value, max_lvalue, onTrackbarChange);createTrackbar("a Value", "Lab Color", &a_value, max_avalue, onTrackbarChange);createTrackbar("b Value", "Lab Color", &b_value, max_bvalue, onTrackbarChange);while (true) {char key = waitKey(10);if (key == 27) { // Press Esc to exitbreak;}}destroyAllWindows();return 0;
}

4. 用conan 构建

1. 下载缺失的库
conan install . --output-folder=build --build=missing
2. build
conan build .

两步之后,就可以正常生成了,只是没有生成到build目录下,然后release 下面就有一个生成的exe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423328.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

CleanClip&#xff1a;革新macOS剪贴板管理体验 目录 功能概览 多格式历史记录保存智能搜索功能快速复制操作拖拽功能 安装指南 前期准备安装步骤 配置与使用 功能概览 多格式历史记录保存 CleanClip支持保存文本、图片、文件等多种格式的复制历史记录&#xff0c;为用户提…

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序(C语言)

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序&#xff08;C语言&#xff09; 前言: 工作需要, 实现一个串口打印的类shell菜单. 如果按照以往的习惯我会自己重新"构思"(狗屎)一个菜单框架.之前用oled和lcd时,我都从零重复造轮子. 作为一个成熟的程序员, 应该要学…

【机器学习(二)】分类和回归任务-决策树算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;树的构造&#xff08;二&#xff09;划分选择1、信息增益2、基尼指数3、卡方检验 &#xff08;三&#xff09;停止标准&#xff08;四&#xff09;剪枝处理1、预剪枝2、后剪枝 三、决策树的优缺点四、决策树分类任…

ai扩图使用什么软件?无损扩图用这5个

你们知道ai扩图是什么吗&#xff1f;其实就是利用人工智能技术对图片进行无损放大处理&#xff0c;让低分辨率的图片变得清晰。通常在图像处理、设计和摄影领域尤为实用。 那么&#xff0c;你们知道ai扩图在线工具怎么选吗&#xff1f;别急&#xff0c;下面这篇文章分享5个超好…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

品读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【品读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【品读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…

【软件文档】软件系统应急处理方案(word原件)

1 总则   1.1 目的 1.2 工作原则   2 应急工作小组机构及职责 3 预警和预防机制 3.1 系统监测及报告   3.2 预警 3.3 预警支持系统 3.4 预防机制 4 应急处理程序 4.1 系统突发事件分类分级的说明 4.2 系统应急预案启动 4.3 现场应急处理 5 保障措施   5.1 应急演练 5.2…

时间复杂度计算 递归

我们先拿出 2021 csp-s 程序题中一道看着就头大的程序题&#xff0c;要求分析 solve1 的复杂度。 设 T(n) ⁡ \operatorname{T(n)} T(n) 表示数组长度为 n n n 时的复杂度&#xff08;即 m − h 1 n m-h1n m−h1n&#xff09;。 T ( 1 ) 1 T(1)1 T(1)1&#xff0c;根据…

R语言机器学习算法实战系列(一):XGBoost算法(eXtreme Gradient Boosting)

介绍 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(GBDT)的优化算法,它在处理大规模数据集和复杂模型时表现出色,同时在防止过拟合和提高泛化能力方面也有很好的表现。以下是XGBoost算法的原理和应用方向的详细介绍: 算法原理 目标函数:XGBoost的目标…

华为ensp中vlan与静态路由技术的实现

vlan 同一网段的设备&#xff0c;可以互通&#xff1b; 虚拟局域网&#xff1a;将局域网从逻辑上划分为多个局域网&#xff0c;不同通过vlan编号区分&#xff1b; 实现网络隔离。提高了网络安全性&#xff1b; vlan编号为12位&#xff1b; 范围1-4094可以用来配置 默认处于…

pytorch-AutoEncoders实战

目录 1. AutoEncoders回顾2. 实现网络结构3. 实现main函数 1. AutoEncoders回顾 如下图&#xff1a;AutoEncoders实际上就是重建自己的过程 2. 实现网络结构 创建类继承自nn.Model&#xff0c;并实现init和forward函数&#xff0c;init中实现encoder、decoder 直接上代码&a…

代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针

目录 二叉树基础深度和高度满二叉树和完全二叉树二叉搜索树和平衡二叉搜索树二叉树节点定义前中后序遍历 递归遍历前序递归遍历—144. 二叉树的前序遍历 迭代遍历层序遍历116. 填充每个节点的下一个右侧节点指针1、题目描述2、思路3、code 二叉树基础 深度和高度 满二叉树和完…

XSS跨站脚本攻击及防护

什么是XSS攻击&#xff1f; XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码&#xff0c;当用户(被攻击者)登录网站时就会执行这些恶意代码&#xff0c;通过这些脚本可以读取cookie,session tokens&#xff0c;或者网站其他敏感的网…

Ubuntu WSL使用技巧

0 Preface/Foreword 1 默认为root用户 当下载完成Ubuntu之后&#xff0c;首次登录&#xff0c;当完成初始化后&#xff0c;提示输入新的用户名时候&#xff0c;直接点击右上角的X按钮&#xff0c;再重新登陆&#xff0c;系统会默认使用root权限登录。 2 root用户和普通用户切换…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦&#xff0c;要点开点按钮这种机械化的操作。 所以就自己整了个脚本&#xff1a; { “id”: “f9999777-9ad6-40e0-9435-4f105919c982”, “version”: “2.0”, “name”: “aliyun”, “url”: “https://developer.aliyun.com”, “tests”: [{ “id”…

ubuntu22安装docker

1、查看服务器系统信息 uname -a&#xff1a;显示内核名称、主机名、内核版本、处理器类型等信息。 lsb_release -a&#xff1a;显示有关 Ubuntu 发行版的详细信息&#xff0c;包括版本号、代号等。 free -h&#xff1a;查看系统内存使用情况。 df -h&#xff1a;查看磁盘空间使…

Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)

目录 1介绍背景 2实现原理 3组件介绍 4代码 5其他说明 1介绍背景 项目背景是 一天的时间轴 10分钟为一间隔 一天被划分成144个节点 一页面12个节点 代码介绍的很详细 可参考或者借鉴 2实现原理 对Element-plus滑块组件的二次封装 基于Vue2&#xff08;2.6.14&#x…

Vue3 : ref 与 reactive

目录 一.ref 二.reactive 三.ref与reactive的区别 四.总结 一.ref 在 Vue 3 中&#xff0c;ref 是一个用于创建可读写且支持数据跟踪的响应式引用对象。它主要用于在组件内部创建响应式数据&#xff0c;这些数据可以是基本类型&#xff08;如 number、string、boolean&…

深入理解全连接层:从线性代数到 PyTorch 中的 nn.Linear 和 nn.Parameter

文章目录 数学概念&#xff08;全连接层&#xff0c;线性层&#xff09;nn.Linear()nn.Parameter()Q1. 为什么 self.weight 的权重矩阵 shape 使用 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)而不是 ( in_featur…

Vue的缓存组件 | 详解KeepAlive

引言 在Vue开发中&#xff0c;我们经常需要处理大量的组件渲染和销毁操作&#xff0c;这可能会影响应用的性能和用户体验。而Vue的KeepAlive组件提供了一种简便的方式来优化组件的渲染和销毁流程&#xff0c;通过缓存已经渲染的组件来提升应用的性能。 本文将详细介绍Vue的Ke…