c++视觉处理 ------ 反向投影图和直方图的变化

news2024/12/24 9:38:19

通道混合:cv::mixChannels

cv::mixChannels 是 OpenCV 中的一个函数,用于执行通道混合或通道分离操作。通常情况下,这个函数用于处理多通道图像,允许你从多通道图像中提取或重新排列通道,或者将不同通道的数据组合到一个新的多通道图像中。

以下是 cv::mixChannels 函数的基本用法:

void cv::mixChannels(const cv::Mat* src, int nsrcs, cv::Mat* dst, int ndsts, const int* fromTo, int npairs);
  • src:源图像数组,包含多通道图像。
  • nsrcs:源图像数组中的图像数量。
  • dst:目标图像数组,包含多通道图像。
  • ndsts:目标图像数组中的图像数量。
  • fromTo:一个整数数组,用于指定通道混合或复制的映射。它的格式为 [srcChannel1, dstChannel1, srcChannel2, dstChannel2, ...],其中 srcChannel 是源通道的索引,dstChannel 是目标通道的索引。
  • npairs:通道映射的数量。

通常,fromTo 数组的长度应为 2 * npairs。对于通道混合,你可以在 fromTo 中指定从源通道到目标通道的映射。对于通道分离,你可以将一个通道映射到多个目标通道。

下面是一个示例,演示如何使用 cv::mixChannels 函数将彩色图像的通道混合:

#include <opencv2/opencv.hpp>

int main() {
    // 读取一幅彩色图像
    cv::Mat image = cv::imread("color_image.jpg");

    if (image.empty()) {
        std::cerr << "Error: Could not read the image." << std::endl;
        return -1;
    }

    // 创建一个新的多通道图像,准备用于通道混合
    cv::Mat newImage(image.size(), image.type());

    // 定义通道混合映射
    int fromTo[] = {0, 2, 1, 1, 2, 0};  // 将BGR通道混合为RGB

    // 执行通道混合
    cv::mixChannels(&image, 1, &newImage, 1, fromTo, 3);

    // 显示混合后的图像
    cv::imshow("Mixed Image", newImage);
    cv::waitKey(0);

    return 0;
}

在这个示例中,cv::mixChannels 函数被用于将彩色图像的通道从BGR混合为RGB,然后显示混合后的图像。你可以根据需要调整通道混合映射,以执行不同的通道操作。

反向投影图和直方图的变化

#include <opencv2/opencv.hpp>

// 全局变量声明
cv::Mat g_srcImage;
cv::Mat g_hsvImage;
cv::Mat g_hueImage;
int g_bins = 30;  // 直方图组距

// 全局函数声明
void on_BinChange(int, void*);

int main() {
    // 读取源图像并转换为HSV色彩空间
    g_srcImage = cv::imread("1.jpg", 1);
    if (!g_srcImage.data) {
        printf("读取图片错误,请确保目录下有指定的图片存在!\n");
        return false;
    }
    cv::cvtColor(g_srcImage, g_hsvImage, cv::COLOR_BGR2HSV);

    // 分离Hue(色调)通道
    g_hueImage.create(g_hsvImage.size(), g_hsvImage.depth());
    int ch[] = { 0, 0 };
    cv::mixChannels(&g_hsvImage, 1, &g_hueImage, 1, ch, 1);

    // 创建Trackbar用于输入直方图组距
    cv::namedWindow("原始图", cv::WINDOW_AUTOSIZE);
    cv::createTrackbar("色调组距", "原始图", &g_bins, 180, on_BinChange);
    on_BinChange(0, 0);  // 进行一次初始化

    // 显示原始图像
    cv::imshow("原始图", g_srcImage);

    // 等待用户按键
    cv::waitKey(0);
    return 0;
}

// 响应滑动条移动消息的回调函数
void on_BinChange(int, void*) {
    // 参数准备
    cv::MatND hist;
    int histSize = std::max(g_bins, 2);
    float hue_range[] = { 0, 180 };
    const float* ranges = { hue_range };

    // 计算直方图并归一化
    cv::calcHist(&g_hueImage, 1, 0, cv::Mat(), hist, 1, &histSize, &ranges, true, false);
    cv::normalize(hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());

    // 计算反向投影
    cv::MatND backproj;
    cv::calcBackProject(&g_hueImage, 1, 0, hist, backproj, &ranges, 1, true);

    // 显示反向投影
    cv::imshow("反向投影图", backproj);

    // 参数准备
    int w = 400, h = 400;
    int bin_w = cvRound((double)w / histSize);
    cv::Mat histImg = cv::Mat::zeros(w, h, CV_8UC3);

    // 绘制直方图
    for (int i = 0; i < g_bins; i++) {
        cv::rectangle(histImg, cv::Point(i * bin_w, h), cv::Point((i + 1) * bin_w, h - cvRound(hist.at<float>(i) * h / 255.0)), cv::Scalar(100, 123, 255), -1);
    }

    // 显示直方图窗口
    cv::imshow("直方图", histImg);
}

在这里插入图片描述

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

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

相关文章

用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)

2.4 计算机视觉中的距离度量 在深度学习和计算机视觉中&#xff0c;距离度量通常用于比较图像、视频或其他数据的特征或嵌入。根据具体任务和数据属性&#xff0c;可以使用不同类型的距离度量。下面介绍了深度学习和计算机视觉中使用的一些常见类型的距离度量。 余弦相似性距…

spring6项目搭建(入门)

文章目录 环境要求构建模块引入依赖初试Bean创建测试类测试对象实现的原理 环境要求 JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; Maven&#xff1a;3.6 Spring&#xff1a;6.0.2 构建模块 首先建立的spring的项目&#xff08;project&…

easy code 模板案例 (author作者 修改+swagger-ui+mybatis plus)

pojo ##引入宏定义 $!{define.vm} ##使用宏定义设置回调&#xff08;保存位置与文件后缀&#xff09; #save("/pojo", ".java") ##使用宏定义设置包后缀 #setPackageSuffix("pojo") ##使用全局变量实现默认包导入 $!{autoImport.vm} import ja…

不了解无线调制方式?这几个“老古董”大家现在还在用!

当我们使用手机、电视、互联网或其他无线通信设备进行通信时&#xff0c;数字调制技术起到了关键作用。这些技术是将我们的声音、文字、图像和数据转换成适合在无线信道上传输的模拟信号的重要工具。 从最早的调幅调制&#xff08;ASK&#xff09;到现代的正交频分复用&#xf…

半导体分立器件动态测试参数有哪些?纳米软件半导体测试厂商如何助力测试?

上期我们介绍了半导体静态测试参数以及测试静态参数的必要性&#xff0c;今天我们将对半导体分立器件的动态测试参数展开描述。动态参数测试是半导体测试的另一项重要内容&#xff0c;它可以检测半导体在开关过程中的响应时间、电流变化和能量损耗情况。 半导体动态测试参数是指…

【C++】C++11——智能指针、内存泄漏、智能指针的使用和原理、RAII、auto_ptr、unique_ptr、shared_ptr、weak_ptr

文章目录 C117.智能指针7.1内存泄漏7.2智能指针的概念7.3智能指针的使用7.3.1 auto_ptr7.3.2 unique_ptr7.3.3 shared_ptr7.3.4 weak_ptr C11 7.智能指针 7.1内存泄漏 什么是内存泄漏&#xff1a; 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏…

矿区井下智慧用电安全监测解决方案

一、背景 矿区井下作业具有复杂的环境和较高的危险性&#xff0c;对于用电安全的要求尤为严格。传统的管理模式和监测方法往往无法实时、准确地掌握井下用电情况&#xff0c;对安全隐患的排查与预防存在一定局限性。因此&#xff0c;引入智慧用电安全监测解决方案&#xff…

MySQL系列第一篇入门

1.什么是关系型数据库呢&#xff1f; RDBMS 是一种结构化数据存储系统&#xff0c;使用表格间的关系来存储和操作数据。 在关系型数据库中&#xff0c;数据以行和列的形式存储&#xff0c;其中每一行表示一个关系或实体&#xff0c;每一列表示该实体的某个属性或特征 关系型数…

干洗店管理软件,家政洗衣洗鞋店上门服务小程序

干洗店管理系统&#xff0c;洗鞋店小程序下单&#xff0c;收衣收鞋预约&#xff1b; 洗衣店洗鞋店收衣管理APP&#xff0c;根据会员所属地区或门店&#xff0c;自动把信息派送到收衣员工的APP上。 洗衣店洗鞋店小程序&#xff0c;支持通过预约单&#xff0c;生成会员收衣单据或…

Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版

Cisdem Video Player mac是一款功能强大的视频播放器&#xff0c;适用于 macOS 平台。它可用于播放不同格式的视频文件&#xff0c;并具有一些实用的特性和功能。 Cisdem Video Player mac 中文版软件特点 多格式支持&#xff1a;Cisdem Video Player 支持几乎所有常见的视频格…

Flask框架配置celery-[1]:flask工厂模式集成使用celery,可在异步任务中使用flask应用上下文,即拿即用,无需更多配置

一、概述 1、celery框架和flask框架在运行时&#xff0c;是在不同的进程中&#xff0c;资源是独占的。 2、celery异步任务如果想使用flask中的功能&#xff0c;如orm&#xff0c;是需要在flask应用上下文管理器中执行orm操作的 3、使用celery是需要使用到中间件的&#xff0…

2023年【煤气】试题及解析及煤气复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 煤气试题及解析考前必练&#xff01;安全生产模拟考试一点通每个月更新煤气复审模拟考试题目及答案&#xff01;多做几遍&#xff0c;其实通过煤气理论考试很简单。 1、【单选题】100mm以上的煤气管道着火,( )一下把煤…

vue3封装分页组件

1.新建Pagination文件以及该文件夹下新建index.vue 2.在index.vue文件中编写一下代码 <template><div :class"{ hidden: hidden }" class"pagination-container"><el-pagination:background"background"v-model:current-page&qu…

全国快递查询接口,快递,全球快递,配送,物流管理,物流数据,电子商务

一、接口介绍 支持国内外1500快递物流公司的物流跟踪服务&#xff0c;包括顺丰、圆通、申通、中通、韵达等主流快递公司。同时&#xff0c;支持单号识别快递物流公司、按次与按单计费、物流轨迹返回等功能&#xff0c;以满足企业对快递物流查询多维度的需求。 二、使用案例截…

IDEA中.gitignore配置不生效的解决方案

一、创建项目 二、执行以下Git命令 git rm -r --cached . git add . git commit -m "update .gitignore"

接口测试的几种方法

其实无论用那种测试方法&#xff0c;接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文&#xff0c;服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端&#xff0c;客户端接收应答报文这一个过程。 方法一、用LoadRunner实现接口测试 大家都知…

风光十几年的MIUI要无了,小米自研MIOS即将就位

今年8月小米新品发布会上&#xff0c;K60 至尊版亮相的同时带来了下一代系统&#xff08;或者说UI &#xff09;的名字&#xff1a;MIUI 15 。 好家伙不知不觉已经要更到 15 了&#xff0c;大家用过几个版本呢&#xff1f; 回想起 MIUI V1 内测发布、MIUI V5 全民刷机、MIUI 8…

显卡、SSD二合一,华硕这波「技术革命」给我看傻了

通常来讲&#xff0c;高端、低端主板除了芯片组、用料、供电规格等差异&#xff0c;在接口拓展性方面也存在着明显分级。 最常用的 USB 接口倒还好&#xff0c;即便目前最入门级主板基本也能保证至少 4 个&#xff1b; 加上机箱前面板拓展 USB 口&#xff0c;保证一般用户需求…

Android studio安装详细教程

Android studio安装详细教程 文章目录 Android studio安装详细教程一、下载Android studio二、安装Android Studio三、启动Android Studio 一、下载Android studio Android studio安装的前提是必须保证安装了jdk1.8版本以上 1、打开android studio的官网&#xff1a;Download…

3D模型格式转换工具HOOPS Exchange:模型数据自由导入和导出

HOOPS Exchange是一套高性能软件库&#xff0c;可以为软件开发人员提供导入和导出3D文件格式的能力。HOOPS Exchange导入3D数据后&#xff0c;会将3D数据转换为PRC格式存放到内存中&#xff0c;最后导出成为其他3D格式。&#xff08;点击申请HOOPS Exchange免费试用&#xff09…