带有标量转换的 Numpy 乘法数组到 c#

Numpy multiply array with scalar translation to c#

基本上我有这个 python 代码使用 opencv 来查找给定图像中的轮廓。为了改进轮廓识别,我对原始图像应用了调整大小,然后对获得的轮廓应用了一个比率,以将它们“转换”为真实图像大小:

ratio = image.shape[0] / 500.0
image = imutils.resize(original, height = 500)
contours= cv2.findContours(image , cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    approx = cv2.approxPolyDP(c, 0.02 * cv2.arcLength(contour , True), True)
    if len(approx) == 4:
        selectedContour = approx
        break

reshapedSelectedContour = selectedContour.reshape(4, 2) * ratio
#paint contours on original

这是按预期工作的。当我尝试将它翻译成 c# 时,它运行不正常:

double ratio = image.Height() / 500;
Imgproc.Resize(original, image, new Size((int)(image.Width() * 500 / (double)image.Height()), 500));
IList<MatOfPoint> contours = new JavaList<MatOfPoint>();
Imgproc.FindContours(image, contours, new Mat(), Imgproc.RetrList, Imgproc.ChainApproxSimple);

MatOfPoint2f selectedContour = new MatOfPoint2f();

foreach (MatOfPoint contour in contours)
{
    MatOfPoint2f approx = new MatOfPoint2f();
    Imgproc.ApproxPolyDP(new MatOfPoint2f(contour.ToArray()), approx, Imgproc.ArcLength(new MatOfPoint2f(contour.ToArray()), true) * 0.02, true);

    if (approx.Total() == 4)
    {
       selectedContour = approx;
       break;
    }
}

Mat reshapedSelectedContour = new Mat();
Core.Multiply(selectedContour.Reshape(4, 2), new Scalar(ratio), reshapedSelectedContour );
//Paint contours on original

如果我在 image(调整大小的图像)上绘制轮廓,我会得到与 python 和 c# 相同的结果。但是当我尝试在 original 图像上绘制 reshapedSelectedContour 时,python 版本正在运行并且 c# 没有给我相同的输出。

我在 C# 中获取 reshapedSelectedContour 的方法是否正确?

通过手动获取轮廓点并将它们全部乘以比率解决了