本文測試環境:
win10 64位
vistual studio 2019
Emgu CV 4.6.0
環境配置準備:
1 新增控制台項目,.net framework為4.7.2
2 把win-x64目錄的native目錄下的檔案全部拷貝到項目的運作目錄Debug目錄下
3 項目選擇x64
4 添加項目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll
具體配置參考:
Emgu CV4圖像處理之環境搭建1(C#)_zxy2847225301的部落格-CSDN部落格
下面内容部分參考自:
EmguCV-第11講-ROI與mask掩碼_YADONCHEN的部落格-CSDN部落格_emgucv 掩模
【OpenCV學習筆記】十三、ROI與mask掩碼_zlm丶的部落格-CSDN部落格_mask掩碼
ROI:個人了解是,從原圖中,截取指定矩形區域的内容
代碼例子:
chunfen1.png原圖
Logo.png原圖
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat srcPic = new Mat("chunfen1.png");
Mat logo = new Mat("Logo.png");
ROITest(srcPic, logo);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
private static void ROITest(Mat srcPic, Mat logo)
{
Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
CvInvoke.Imshow("imgROI", imgROI);
CvInvoke.WaitKey(0);
}
}
}
運作結果如下:
mask遮罩
初級融入:個人了解是,把一張小的圖檔(一般為Logo圖檔),原封不動地替換到原圖ROI對應的位置
代碼如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat srcPic = new Mat("chunfen1.png");
Mat logo = new Mat("Logo.png");
PrimaryROI(srcPic, logo);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 初級融合
/// </summary>
/// <param name="srcPic"></param>
/// <param name="logo"></param>
public static void PrimaryROI(Mat srcPic,Mat logo)
{
Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
logo.CopyTo(imgROI);
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.WaitKey(0);
}
}
}
運作結果如下圖:
看到沒有,把Logo圖塞進原來ROI的位置了
圓形融合:個人了解是把遮罩的形狀變成圓形,看起來圓滑一點
代碼如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat srcPic = new Mat("chunfen1.png");
Mat logo = new Mat("Logo.png");
CicleROI(srcPic, logo);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 圓形ROI
/// </summary>
/// <param name="srcPic"></param>
/// <param name="logo"></param>
private static void CicleROI(Mat srcPic, Mat logo)
{
Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
//定義了一個長為logo.Cols,寬為logo.Rows的矩形遮罩
Mat mask = Mat.Zeros(logo.Rows, logo.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 3);
CvInvoke.Imshow("mask_rec", mask);
CvInvoke.Circle(mask, new System.Drawing.Point(logo.Size.Width/2, logo.Size.Height / 2), logo.Size.Width / 2, new MCvScalar(255,255,255),-1);
CvInvoke.Imshow("draw_cicle", mask);
logo.CopyTo(imgROI, mask);
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.WaitKey(0);
}
}
}
運作結果如下圖:
進階融合:個人了解是把一張圖(一般為Logo圖)塞進另外一張圖,Logo圖比較特别,背景色一般為純色(白色),然後把Logo取反後二值化,即把背景色去掉了,隻留下Logo重要的内容
代碼如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat srcPic = new Mat("chunfen1.png");
Mat logo = new Mat("Logo.png");
HightROI(srcPic, logo);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 進階融入
/// </summary>
/// <param name="srcPic"></param>
/// <param name="logo"></param>
public static void HightROI(Mat srcPic, Mat logo)
{
Mat imgROI = new Mat(srcPic, new System.Drawing.Rectangle(20, 20, logo.Cols, logo.Rows));
Mat mask = logo.Clone();
//對遮罩取反
CvInvoke.BitwiseNot(mask, mask);
//對遮罩進行二值化處理
CvInvoke.Threshold(mask, mask, 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.Imshow("mask", mask);
logo.CopyTo(imgROI,mask);
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.WaitKey(0);
}
}
}
運作結果如下圖: