相關(guān)鏈接
C++&Python&Csharp in OpenCV 專欄
【2022B站最好的OpenCV課程推薦】OpenCV從入門到實(shí)戰(zhàn) 全套課程(附帶課程課件資料+課件筆記)
前言
今天來接著學(xué)習(xí)OpenCV,現(xiàn)在主要是以Python代碼為主了,所以先實(shí)現(xiàn)Python,在用C++/Csharp重現(xiàn)一遍。
測試圖片
邊界填充
邊界填充就是向外填充圖片信息,將圖片擴(kuò)大。填充分為上下左右四個方向,所以我們要指定四個方向的填充大小。
python
# %%
# 導(dǎo)入包
import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread("D:/workSpace/OpenCV/HellOpenCV/Resources/image/cat.png")
# 聲明填充區(qū)域
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這個庫,得去自己手動導(dǎo)入一下
額,我還是放棄了。我把相關(guān)的連接放在這里了,C++的環(huán)境配置實(shí)在是過于麻煩,要修改項目配置,還要修改文件內(nèi)容,還要添加環(huán)境變量。我這里就不做對應(yīng)的配置了。我嘗試配置了一下,沒配置出來
C++調(diào)用matplotlib繪圖總結(jié)
c++調(diào)用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;
//運(yùn)行邊界填充
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生態(tài)和使用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";
//創(chuàng)建Python環(huán)境
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("運(yùn)行完畢");
Console.ReadLine();
}
}
我們直接用是不可以的,因為他底層的代碼不一樣。matplotlib必須要是數(shù)組形式的數(shù)據(jù)輸入。那我們需要將Mat轉(zhuǎn)化為數(shù)組。
Mat遍歷
Opencv:通過Mat遍歷圖像的5種方法
C++ 高效的遍歷opencv Mat像素
我這里就直接上結(jié)果了
/// <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;
}
最終代碼和結(jié)果
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";
//創(chuàng)建Python環(huán)境
PythonEngine.Initialize();
//展開Python的全局解釋器
using (Py.GIL())
{
dynamic plt = Py.Import("matplotlib.pyplot");
//轉(zhuǎn)化成3通道數(shù)組
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");
//展示結(jié)果
plt.show();
Console.WriteLine("運(yùn)行完畢");
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;
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-818485.html
總結(jié)
今天不僅了解了一下這個代碼,還順便了解了一下Csharp怎么代用Python的matplotlib。C++ 沒配成功,看網(wǎng)上的代碼太麻煩了,而且我也不用C++ 作為開發(fā)軟件,只是單純的稍微了解一下。文章來源地址http://www.zghlxwxcb.cn/news/detail-818485.html
到了這里,關(guān)于C++&Python&C# 三語言O(shè)penCV從零開發(fā)(6):邊界填充+Csharp調(diào)用Python matplotlib代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!