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

这篇具有很好参考价值的文章主要介绍了C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关链接

C++&Python&Csharp in OpenCV 专栏

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

前言

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

测试图片

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

边界填充

边界填充就是向外填充图片信息,将图片扩大。填充分为上下左右四个方向,所以我们要指定四个方向的填充大小。
C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&Python&Csharp in OpenCV,c++,python,c#

python

# %%
# 导入包
import cv2
import matplotlib.pyplot as plt
import numpy as np

image = 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# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&Python&Csharp in OpenCV,c++,python,c#

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;
}

C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&amp;Python&amp;Csharp in OpenCV,c++,python,c#

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();
     }
 }

C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&amp;Python&amp;Csharp in OpenCV,c++,python,c#
我们直接用是不可以的,因为他底层的代码不一样。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;
    }
}

C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&amp;Python&amp;Csharp in OpenCV,c++,python,c#

C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码,C++&amp;Python&amp;Csharp in OpenCV,c++,python,c#

总结

今天不仅了解了一下这个代码,还顺便了解了一下Csharp怎么代用Python的matplotlib。C++ 没配成功,看网上的代码太麻烦了,而且我也不用C++ 作为开发软件,只是单纯的稍微了解一下。文章来源地址https://www.toymoban.com/news/detail-818485.html

到了这里,关于C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++&Python&C# 三语言OpenCV从零开发(5):ROI截取

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) ROI,本意是感兴趣区域。但是使用起来就和PS的截取部分区域差不多。 我之前写过一篇Python 的代码 Python+OpenCV 零基础学习笔记(6):ROI 其它的相关文章 OpenCV之感

    2024年01月25日
    浏览(39)
  • C++&Python&C# 三语言OpenCV从零开发(4):视频流读取

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) OpenCV 教程中文文档|OpenCV中文 OpenCV教程中文文档|W3Cschool OpenCV基础教程——视频的读取与写入(超详细+附代码) 我之前写过一篇基于Python的,我现在重新写一次

    2024年01月21日
    浏览(49)
  • C++&Python&C# 三语言OpenCV从零开发(3):图像读取和显示

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) OpenCV4 C++ 快速入门视频30讲 - 系列合集 OpenCV4 C++ 课程笔记 在上一章纠结过教程的选择之后,还是觉得老老实实从零开始学OpenCV,从OpenCV C++视频教程开始。 这

    2024年01月21日
    浏览(44)
  • 计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月24日
    浏览(30)
  • 八、计算机视觉-边界填充

    在Python中使用OpenCV进行边界填充(也称为zero padding)是一种常见的图像处理操作,通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法 边界填充的原理是在图像的周围添加一圈像素,这些像素的值通常设置为0,因此

    2024年02月19日
    浏览(25)
  • python opencv实现找到图像的轮廓,填充颜色

    我想找到图片中的闭合圈,然后填充颜色 所需要的cv函数: 1。 OpenCV提供的findContours()方法可以通过计算图像梯度来判断出图像的边缘,然后将边缘的点封装成数组返回。    image : 为检测的图像,必须是8位单通道二值图像。如果原图为彩色的,必须转为灰度图,并通过二值

    2024年02月04日
    浏览(32)
  • OpenCV-Python学习(13)—— OpenCV 多边形填充与绘制(cv.fillPoly、cv.polylines)

    1. 知识点 学习 cv.polylines 函数的使用; 学习 cv.fillPoly 函数的使用。 2. 绘制折线或多边形 cv.polylines 函数说明 2.1 函数使用 2.2 参数说明 参数 说明 img 表示要在其上绘制矩形的图像的img对象。 pts 表示一个或多个点集。 isClosed 表示标志,决定所绘制的多边形是否闭合。若为 T

    2024年02月16日
    浏览(37)
  • OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)

    函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形绘制) OpenCV函数简记_第三章数字图像的滤波处理(方框,均值,高斯,中值和双边滤波) OpenC

    2024年02月05日
    浏览(41)
  • C# &OpenCV 从零开发(0):前言

    由于我想换个机器视觉+运动控制的工作,我就开始了自学机器视觉方向的技术。但是Halcon毕竟是商业化的库,国内用盗版还是怕被告。所以期望使用OpenCV。 OpenCV目前已知的方法的有两个版本 Python:用起来挺简单的,就是Python的语言不适合管理,感觉以后必定会出现问题,不适

    2024年01月18日
    浏览(50)
  • 【30天python从零到一】---第六天:函数、变量作用域、函数的链式调用和递归调用

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 Python专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己

    2023年04月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包