OpenCV 4.10 windows 上编译并上传conan

news2024/11/19 15:19:08

目录

一. 上传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 os

from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps

class 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_test
    LIBRARY 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 exit
            break;
        }
    }

    destroyAllWindows();
    return 0;
}

4. 用conan 构建

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTFHub技能树-密码口令-弱口令

目录 前提知识 BrupSuite爆破的四种模式详解 解题过程 通常认为容易被别人&#xff08;他们有可能对你很了解&#xff09;猜测到或被破解工具破解的口令均为弱口令。 前提知识 BrupSuite爆破的四种模式详解 四种模式分别为&#xff1a;Sniper、Battering ram、Pitchfork、…

Visual Studio 2022从外部引入dll导致的问题

这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中&#xff0c;有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下&#xff1a; 3、点击浏览选项&#xff0c;选择想要引入dll的路径&#xff0c;这里我选择下载MapGIS 10的路径 …

[LitCTF 2024]SAS - Serializing Authentication

题目提示反序列化 源码 <?phpclass User {public $username;public $password;function __construct($username, $password) {$this->username $username;$this->password $password;}function isValid() { return $this->username admin && $this-&g…

《JavaEE进阶》----17.<Mybatis基本操作【注解XML】>

本篇博客详细讲解了&#xff1a;编写SQL语句 1.使用注释 2.使用XML 3.多表查询 前言&#xff1a; Mybatis规范中方法名不能重复&#xff0c;即便参数不同。因为每一个方法名都是有一个唯一的ID标识的。因此不能重复。 我们会将数据库相关的接口放在Mapper包下面。 对&#xff0…

Latex输入数学期望E及花体符号方法

一、数学期望 E \mathbb{E} E 使用Latex写论文时&#xff0c;我们希望输入如下图所示的数学期望&#xff1a; 方法如下&#xff1a; 首先需要导入\usepackage{amssymb}包&#xff0c;然后正文使用描述为\mathbb{E} 二、花体 B \mathcal{B} B 此外&#xff0c;当我们希望…

外贸获客:主动开发有用吗?

今天主要和大家聊聊&#xff0c;做外贸几个常用的获客渠道。 开发客户的渠道大体上分两种&#xff1a;1、主动开发&#xff1b;2、被动询盘 我们一一进行解析。1、社交媒体开发 即利用社交媒体&#xff0c;如Youtube、LinkedIn、Instagram、TikTok、Facebook等平台进行客户开发…

30道软件测试基础面试题!(含答案)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…

JS Reflect 对象 — 深度解析

JS Reflect 对象 — 深度解析 在JavaScript的广阔天地里&#xff0c;Reflect对象如同一面明镜&#xff0c;映射出底层语言操作的精髓。作为前端开发者&#xff0c;掌握Reflect对象及其相关API&#xff0c;无疑能够提升我们的编程技艺&#xff0c;让代码更加简洁、高效。接下来&…

AV1 Bitstream Decoding Process Specification--[1]:术语和定义

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

浅谈C++入门(1)

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、C的第一个程序 二、 命名空间 2.1 namespace的价值 2.2 namesapce的定义&#xff08;这里一些东西以记住加理解为主&#xff09; 2.…

国产服务器CPU发展分析

CPU行业概览&#xff1a;信创带动服务器CPU国产化 目前CPU行业由两大生态体系主导&#xff1a;一是基于X86指令系统和Windows操作系统的Wintel体系&#xff0c;主要用于服务器与电脑等&#xff1b;二是基于ARM指令系统和Android操作系统的AA体系&#xff0c;主要用于移动设备…

数据结构加餐:三路划分、自省排序、文件归并排序

数据结构加餐1 1.快排之三路划分2.快排之自省排序3.文件归并排序3.1外排序3.2归并排序的实现3.2.1归并排序思想3.2.2文件归并排序代码实现 1.快排之三路划分 在之前完成的快排仍然存在这一些问题&#xff0c;当重复数据较多时&#xff0c;快速排序选择的基值也会较不恰当&#…

SaaS化多租户实现的两种方法

SaaS化多租户实现的两种方法 SaaS系统的定义 SaaS&#xff0c;全称为Software-as-a-Service&#xff08;软件即服务&#xff09;&#xff0c;是一种基于云计算的软件交付模式。而SaaS系统&#xff0c;即是通过这种模式提供给用户的软件系统。即多租户系统&#xff0c;每个租户…

MySQL 日志篇:Redo 文件和自适应检查点

MySQL 的 InnoDB 存储引擎使用 Redo Log 记录事务对数据的更改&#xff0c;以便在系统崩溃恢复时能够重做这些更改&#xff0c;从而保证事务的持久性。对于产生的 Redo Log&#xff0c;InnoDB 存储引擎首先将其写入内存中的 Log Buffer&#xff0c;随后再将 Log Buffer 中的 Re…

力扣337-打家劫舍 III(Java详细题解)

题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 本体是打家劫舍的一个变形题&#xff0c;希望大家能先做198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09;&#xff0c;并看一下我上题的讲解力扣198-打家劫舍&…

【刷题】Day 3--错误的集合

hello&#xff01;又见面啦~~~ 一道习题&#xff0c;要长脑子了...... 【. - 力扣&#xff08;LeetCode&#xff09;】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

多速率信号处理-CIC滤波器

基本原理 级联积分梳状滤波器&#xff08;Cascade Intergrator Comb&#xff09;是多速率信号处理中一种十分高效的数字滤波器。CIC滤波器具有低通滤波器的特性&#xff0c;同时具有以下优势&#xff1a; 滤波器系数全为1&#xff0c;设计时不需要存储滤波器系数&#xff0c;…

拖放WORD文件朗读全文

把WORD拖放到tkinter的窗口&#xff0c;就可以朗读整改word文件的内容。 代码&#xff1a; # -*- coding: utf-8 -*- """ Created on Tue Sep 10 17:09:35 2024author: YBK """ import pyttsx3 import comtypes.client import os import tkint…

按包边(边框)尺寸分类异形创意圆形(饼/盘)LED显示屏有哪些种类

在LED显示屏技术日新月异的今天&#xff0c;异形创意圆形&#xff08;饼/盘&#xff09;LED显示屏凭借其独特的形态设计与广泛的应用场景&#xff0c;成为了商业展示、舞台表演、艺术装置以及户外广告等领域的宠儿。其中&#xff0c;按包边&#xff08;边框&#xff09;尺寸的不…

holynix靶机详解

靶机配置 加一个网络适配器&#xff08;网卡&#xff09; 修改MAC地址 00:0C:29:BC:05:DE 原来的网卡设置为桥接&#xff0c;随机生成MAC地址 重启靶机即可扫到靶机IP 主机探测与端口扫描 arp-scan -l 发现开放80端口 nmap -sV -A -T4 192.168.229.153 访问网站 http://1…