94 lines
4.3 KiB
C#
94 lines
4.3 KiB
C#
using System.Collections.Generic;
|
|
using OpenCvSharp;
|
|
using Com.Lmc.ShuiYin.One.Util;
|
|
using Com.Lmc.ShuiYin; // For ShuiYinUtils
|
|
|
|
namespace Com.Lmc.ShuiYin.One.Converter
|
|
{
|
|
public class DftConverter : Converter
|
|
{
|
|
public Mat Start(Mat src)
|
|
{
|
|
src.ConvertTo(src, MatType.CV_32F);
|
|
List<Mat> planes = new List<Mat>();
|
|
Mat com = new Mat();
|
|
planes.Add(src);
|
|
planes.Add(Mat.Zeros(src.Size(), MatType.CV_32F));
|
|
Cv2.Merge(planes.ToArray(), com);
|
|
Cv2.Dft(com, com);
|
|
return com;
|
|
}
|
|
|
|
public void Inverse(Mat com)
|
|
{
|
|
List<Mat> planes = new List<Mat>();
|
|
Cv2.Idft(com, com);
|
|
Cv2.Split(com, out Mat[] splitPlanes);
|
|
planes.AddRange(splitPlanes);
|
|
Cv2.Normalize(planes[0], com, 0, 255, NormTypes.MinMax, (int)MatType.CV_8UC3);
|
|
}
|
|
|
|
public void AddTextWatermark(Mat com, string watermark)
|
|
{
|
|
Scalar s = new Scalar(255, 255, 255, 0);
|
|
Point p = new Point(0, com.Rows / 3);
|
|
int thickness = 3;
|
|
// Note: ShuiYinUtils needs to be implemented. Assuming it exists.
|
|
double fontScale = ShuiYinUtils.GetFontScale(new Size(com.Cols, com.Rows / 2), watermark, HersheyFonts.HersheyComplex, thickness);
|
|
Cv2.PutText(com, watermark, p, HersheyFonts.HersheyComplex, fontScale, s, thickness, LineTypes.Link8, false);
|
|
Cv2.Flip(com, com, FlipMode.X); // -1 in OpenCV is both axes, but here it seems they use -1. In OpenCvSharp FlipMode.XY is -1.
|
|
// Wait, Java code says -1. OpenCvSharp FlipMode: X=0, Y=1, XY=-1.
|
|
// Let's check Java docs: 0 means flipping around the x-axis... wait.
|
|
// OpenCV: 0 means flipping around the x-axis and positive value (for example, 1) means flipping around y-axis. Negative value (for example, -1) means flipping around both axes.
|
|
// So -1 is XY.
|
|
Cv2.Flip(com, com, FlipMode.XY);
|
|
Cv2.PutText(com, watermark, p, HersheyFonts.HersheyComplex, fontScale, s, thickness, LineTypes.Link8, false);
|
|
Cv2.Flip(com, com, FlipMode.XY);
|
|
}
|
|
|
|
public void AddImageWatermark(Mat com, Mat watermark)
|
|
{
|
|
List<Mat> planes = new List<Mat>();
|
|
List<Mat> newPlanes = new List<Mat>();
|
|
Mat temp = new Mat();
|
|
int col = (com.Cols - watermark.Cols) >> 1;
|
|
int row = ((com.Rows >> 1) - watermark.Rows) >> 1;
|
|
watermark.ConvertTo(watermark, MatType.CV_32F);
|
|
Cv2.CopyMakeBorder(watermark, watermark, row, row, col, col, BorderTypes.Constant, Scalar.All(0));
|
|
planes.Add(watermark);
|
|
Cv2.Flip(watermark, temp, FlipMode.XY);
|
|
planes.Add(temp);
|
|
|
|
// vconcat expects an array of Mats
|
|
Mat[] planesArray = planes.ToArray();
|
|
// In Java: vconcat(planes, watermark); -> watermark becomes the concatenation.
|
|
// In C#: Cv2.VConcat(planes, watermark);
|
|
Cv2.VConcat(planesArray, watermark);
|
|
|
|
newPlanes.Add(watermark);
|
|
newPlanes.Add(watermark);
|
|
Cv2.Merge(newPlanes.ToArray(), watermark);
|
|
Utils.FixSize(watermark, com);
|
|
Cv2.AddWeighted(watermark, 8, com, 1, 0.0, com);
|
|
|
|
Cv2.Split(com, out Mat[] splitCom);
|
|
// The Java code ends with split(com, planes), but doesn't return or use planes. It seems redundant or side-effect based if 'planes' was a field, but it's local.
|
|
// Actually, in Java code: split(com, planes); where planes is a local List<Mat>. This seems useless at the end of the method unless it modifies 'com' in place (it doesn't, split fills the list).
|
|
// So I can ignore it.
|
|
}
|
|
|
|
public Mat ShowWatermark(Mat src)
|
|
{
|
|
Mat mag = new Mat();
|
|
Cv2.Split(src, out Mat[] splitSrc);
|
|
// Java: magnitude(newPlanes.get(0), newPlanes.get(1), mag);
|
|
Cv2.Magnitude(splitSrc[0], splitSrc[1], mag);
|
|
Cv2.Add(Mat.Ones(mag.Size(), MatType.CV_32F), mag, mag);
|
|
Cv2.Log(mag, mag);
|
|
mag.ConvertTo(mag, MatType.CV_8UC1);
|
|
Cv2.Normalize(mag, mag, 0, 255, NormTypes.MinMax, (int)MatType.CV_8UC1);
|
|
return mag;
|
|
}
|
|
}
|
|
}
|