C++PythonC# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码

文章目录

  • 相关链接
  • 前言
  • 测试图片
  • 边界填充
    • python
    • C++
    • Csharp
      • 错误代码
      • Mat遍历
      • 最终代码和结果
  • 总结

相关链接

C++&Python&Csharp in OpenCV 专栏

【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)

前言

今天来接着学习OpenCV,现在主要是以Python代码为主了,所以先实现Python,在用C++/Csharp重现一遍。

测试图片

在这里插入图片描述

边界填充

边界填充就是向外填充图片信息,将图片扩大。填充分为上下左右四个方向,所以我们要指定四个方向的填充大小。
在这里插入图片描述

python

# %%
# 导入包
import cv2
import matplotlib.pyplot as plt
import numpy as npimage = cv2.imread("D:/workSpace/OpenCV/HellOpenCV/Resources/image/cat.png")# 声明填充区域
fill = {'top':50,'bottom':50,'left':50,'right':50
}# 填充也有很多的算法,我们这里尝试几个算法replicate = cv2.copyMakeBorder(image,fill['top'],fill['bottom'],fill['left'],fill['right'], cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image,fill['top'],fill['bottom'],fill['left'],fill['right'],cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(image,fill['top'],fill['bottom'],fill['left'],fill['right'],cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(image,fill['top'],fill['bottom'],fill['left'],fill['right'],cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(image,fill['top'],fill['bottom'],fill['left'],fill['right'],cv2.BORDER_CONSTANT,value=0)plt.subplot(231),plt.imshow(image,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')plt.show()# cv2.imshow("python",image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

在这里插入图片描述

C++

Python跑好了,但是C++和Csharp没有matplotlib.pyplot这个库,得去自己手动导入一下

额,我还是放弃了。我把相关的连接放在这里了,C++的环境配置实在是过于麻烦,要修改项目配置,还要修改文件内容,还要添加环境变量。我这里就不做对应的配置了。我尝试配置了一下,没配置出来

C++调用matplotlib绘图总结

c++调用matplotlib(一)

Visual Studio配置C++绘图库matplotlibcpp的方法


#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc.hpp>  
#include<iostream>  
using namespace std;
int main()
{cv::Mat image = cv::imread("D:/workSpace/OpenCV/HellOpenCV/Resources/image/cat.png");auto fill = new int[4] {50, 50, 50, 50};//声明变量cv::Mat replicate;cv::Mat reflect;cv::Mat reflect101;cv::Mat wrap;cv::Mat constant;//运行边界填充cv::copyMakeBorder(image, replicate, fill[0], fill[1], fill[2], fill[3], cv::BORDER_REPLICATE);cv::copyMakeBorder(image, reflect, fill[0], fill[1], fill[2], fill[3], cv::BORDER_REFLECT);cv::copyMakeBorder(image, reflect101, fill[0], fill[1], fill[2], fill[3], cv::BORDER_REFLECT101);cv::copyMakeBorder(image, wrap, fill[0], fill[1], fill[2], fill[3], cv::BORDER_WRAP);cv::copyMakeBorder(image, constant, fill[0], fill[1], fill[2], fill[3], cv::BORDER_CONSTANT);cv::imshow("image", image);cv::imshow("replicate", replicate);cv::imshow("reflect", reflect);cv::imshow("reflect101", reflect101);cv::imshow("wrap", wrap);cv::imshow("constant", constant);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

在这里插入图片描述

Csharp

Csharp我倒是跑通了,没想到Csharp反而是最简单的了。

PythonNet,Csharp如何白嫖Python生态和使用Matplotlib

错误代码

 static void Main(string[] args){Mat image = Cv2.ImRead("D:/workSpace/OpenCV/HellOpenCV/Resources/image/cat.png");(int top, int bottom, int left, int right) fill = (50, 50, 50, 50);Mat replicate = new Mat();Mat reflect = new Mat();Mat reflect101 = new Mat();Mat wrap = new Mat();Mat constant = new Mat();Cv2.CopyMakeBorder(image, replicate, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Replicate);Cv2.CopyMakeBorder(image, reflect, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Reflect);Cv2.CopyMakeBorder(image, reflect101, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Reflect101);Cv2.CopyMakeBorder(image, wrap, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Wrap);Cv2.CopyMakeBorder(image, constant, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Constant);//Cv2.ImShow("name",image);//Cv2.WaitKey(0);//选择你Python的dll位置Runtime.PythonDLL = @"D:\Anaconda3\python311.dll";//创建Python环境PythonEngine.Initialize();//展开Python的全局解释器using (Py.GIL()){dynamic plt = Py.Import("matplotlib.pyplot");plt.subplot(231); plt.imshow(image, "gray"); plt.title("image");plt.show();Console.WriteLine("运行完毕");Console.ReadLine();}}

在这里插入图片描述
我们直接用是不可以的,因为他底层的代码不一样。matplotlib必须要是数组形式的数据输入。那我们需要将Mat转化为数组。

Mat遍历

Opencv:通过Mat遍历图像的5种方法

C++ 高效的遍历opencv Mat像素

我这里就直接上结果了

/// <summary>
/// 3通道遍历
/// </summary>
/// <param name="mat"></param>
/// <returns></returns>
public static int[,,] MatToArray(Mat mat)
{var res = new int[mat.Rows, mat.Cols, mat.Channels()];for(var i =0 ; i < mat.Rows;i++){for(var j = 0 ; j < mat.Cols; j++){var temp = mat.At<Vec3b>(i, j);res[i,j,0] = temp[0];res[i,j,1] = temp[1];res[i,j,2] = temp[2];}}return res;
}

最终代码和结果

internal class Program
{static void Main(string[] args){Mat image = Cv2.ImRead("D:/workSpace/OpenCV/HellOpenCV/Resources/image/cat.png");(int top, int bottom, int left, int right) fill = (50, 50, 50, 50);Mat replicate = new Mat();Mat reflect = new Mat();Mat reflect101 = new Mat();Mat wrap = new Mat();Mat constant = new Mat();Cv2.CopyMakeBorder(image, replicate, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Replicate);Cv2.CopyMakeBorder(image, reflect, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Reflect);Cv2.CopyMakeBorder(image, reflect101, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Reflect101);Cv2.CopyMakeBorder(image, wrap, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Wrap);Cv2.CopyMakeBorder(image, constant, fill.top, fill.bottom, fill.left, fill.right, BorderTypes.Constant);//选择你Python的dll位置Runtime.PythonDLL = @"D:\Anaconda3\python311.dll";//创建Python环境PythonEngine.Initialize();//展开Python的全局解释器using (Py.GIL()){dynamic plt = Py.Import("matplotlib.pyplot");//转化成3通道数组plt.subplot(231); plt.imshow(MatToArray(image), "gray"); plt.title("image");plt.subplot(232); plt.imshow(MatToArray(replicate), "gray"); plt.title("replicate");plt.subplot(233); plt.imshow(MatToArray(reflect), "gray"); plt.title("reflect");plt.subplot(234); plt.imshow(MatToArray(reflect101), "gray"); plt.title("reflect101");plt.subplot(235); plt.imshow(MatToArray(wrap), "gray"); plt.title("wrap");plt.subplot(236); plt.imshow(MatToArray(constant), "gray"); plt.title("constant");//展示结果plt.show();Console.WriteLine("运行完毕");Console.ReadLine();}}/// <summary>/// 3通道遍历/// </summary>/// <param name="mat"></param>/// <returns></returns>public static int[,,] MatToArray(Mat mat){var res = new int[mat.Rows, mat.Cols, mat.Channels()];for(var i =0 ; i < mat.Rows;i++){for(var j = 0 ; j < mat.Cols; j++){var temp = mat.At<Vec3b>(i, j);res[i,j,0] = temp[0];res[i,j,1] = temp[1];res[i,j,2] = temp[2];}}return res;}
}

在这里插入图片描述

在这里插入图片描述

总结

今天不仅了解了一下这个代码,还顺便了解了一下Csharp怎么代用Python的matplotlib。C++ 没配成功,看网上的代码太麻烦了,而且我也不用C++ 作为开发软件,只是单纯的稍微了解一下。

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

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

相关文章

【操作系统】实验二 Proc文件系统

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

网络安全的信息收集方法有哪些?

网络安全攻击中的信息收集是攻击者为了了解目标系统的弱点、配置、环境和潜在的防御措施而进行的活动。以下是一些常见的信息收集手段&#xff1a; 开放网络资源查询&#xff1a; 使用搜索引擎查找关于目标组织的信息&#xff0c;包括新闻稿、社交媒体帖子、官方网站等。通过W…

【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录 一、sort 1.1sort简介 语法 参数 功能 适用容器 1.2sort的用法 1.3自定义比较函数 示例 1265蓝桥题 —— 排序 二、min和max函数 三、min_element和max_element 497蓝桥题 —— 成绩分析 四、nth_element 一、sort 1.1sort简介 sort函数包含在头文件<a…

用户洞察:精准解读用户的真实需求!

洞察用户需求的过程和谈恋爱一样。你不能简简单单地问客户&#xff0c;你想要什么&#xff1f;你有什么痛点&#xff1f;这样的问法是无法得到任何有价值的信息。这就好比谈恋爱的场景&#xff0c;如果你问对方想吃什么&#xff0c;大概率会得到“随便”“都行”这类的答案&…

计算机网络学习first day

In the first day.  首先&#xff0c;我们要先有清晰地学习思路&#xff0c;然后介绍计算机网络的发展及在信息时代的各类应用及带来的一些负面问题。然后是对因特网进行概述&#xff0c;包括网络&#xff0c;互联网和因特网的相关概念&#xff0c;因特网发展的三个历史阶段&a…

python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

一、利用直方图的方式进行批量的图片缺陷检测&#xff08;方法简单&#xff09; 二、步骤&#xff08;完整代码见最后&#xff09; 2.1灰度转换&#xff08;将原图和要检测对比的图分开灰度化&#xff09; 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

基于SpringBoot的SSM整合案例

项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

最新多线程版 FFmpeg 剖析

FFmpeg近期推出了一个重要Feature&#xff0c;即将原来的 FFmpeg 命令行工具由单线程变成了多线程。 ffmpeg -i input.mp4 -c:v libx264 -crf 23 out.mp4 如上面的命令&#xff0c;以前使用上面命令进行转码时&#xff0c;由于它是单线程工作模式&#xff0c;因此只能利用一个…

写一个简单的python服务测试

1&#xff1a;引用sanic pip install sanic 2: 引用sanic 跨域 3&#xff1a; #-*- coding: UTF-8 -*- # !/usr/bin/python # time :2022/2/22 21:43 # author :Mo # function :get/post of sanicfrom sanic.response import json, text from sanic import Sanic, req…

vs2022配置OpenCV测试

1&#xff0c;下载Opencv安装包 OpenCV官网下载地址&#xff1a;Releases - OpenCV 大家可以按需选择版本进行下载&#xff0c;官网下载速度还是比较慢的&#xff0c;推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…