带有标量转换的 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 的方法是否正确?
通过手动获取轮廓点并将它们全部乘以比率解决了
基本上我有这个 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 的方法是否正确?
通过手动获取轮廓点并将它们全部乘以比率解决了