【问题标题】:How to convert "Mat >= int" statement from c++ to C#如何将“Mat >= int”语句从 C++ 转换为 C#
【发布时间】:2019-09-25 09:53:39
【问题描述】:

我刚刚开始使用 OpenCVSharp,我正在尝试将一些 OpenCV 示例程序转换为 C#。我不确定如何从 squares.cpp 转换这一行:

gray = gray0 >= (l + 1) * 255 / N;

这一行给出了错误

运算符'>='不能应用于'Mat'和'int'Op​​enCVSharpTest类型的操作数

graygray0 都是 Mat 实例。 lNint

【问题讨论】:

  • @EdPlunkett 这是与标量的矢量化比较。结果应该是另一个Mat,0s和255s代表false/true(基本上是一个多维数组)。
  • @DanMašek 天哪。这是否意味着表达有意义?
  • @EdPlunkett 是的,它正在对图像进行阈值处理——对图像中的所有 (x,y) 执行 gray(x,y) = gray0(x,y) < ((l+1)*255/N) ? 255 : 0。比较的右边是得到几个等距的阈值水平(它在一个循环中)。
  • @DanMašek 这两个都有效,谢谢。如果您将其发布为答案,我会接受。这是我使用 OpenCVSharp 的第二天,所以我还在摸索。

标签: c# opencv opencvsharp


【解决方案1】:

首先,了解表达式的作用很重要。

cv::Mat gray0; // Somehow this is populated with a grayscale image
int N = 11;

for( int l = 1; l < N; l++ ) {
    cv::Mat gray = gray0 >= (l + 1) * 255 / N;
    // more processing
}

表达式使用MatExpr operator&gt;= (const Mat &amp;a, double s),它是一个matrix expression,对Mat 与一个标量进行矢量化比较。

比较:A cmpop BA cmpop alphaalpha cmpop A,其中cmpop&gt;&gt;===!=&lt;=、@9876543 之一。比较的结果是一个 8 位单通道掩码,其元素设置为 255(如果特定元素或元素对满足条件)或 0。

基本上:

for all (x,y) in the image:
    threshold = (l + 1) * 255 / N
    if (gray0(x,y) >= threshold):
         gray(x,y) = 255
    else
         gray(x,y) = 0

这基本上是一个阈值操作,可以很容易地转换为使用cv::threshold 函数。


OpenCVSharp 似乎将许多 C++ API 运算符映射到 Mat 类的成员函数中。具体来说,Mat.GreaterThanOrEqual 似乎与使用的运算符匹配。

替代 C++ 函数 cv::threshold 映射到 Mat.Threshold。在这种情况下,您需要使用阈值方法THRESH_BINARY,因为它使用&gt; 而不是&gt;=,您需要适当地偏移阈值。

【讨论】:

    【解决方案2】:

    您也可以尝试使用 https://www.tangiblesoftwaresolutions.com/product_details/cplusplus_to_csharp_converter_details.html

    最多可转换 100 行的免费软件。

    【讨论】:

    • 这不仅仅是从 c++ 到 c# 的转换。在这种情况下它是没有用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2015-03-29
    • 2013-04-14
    • 1970-01-01
    • 2022-01-01
    • 2013-09-12
    • 2021-12-28
    相关资源
    最近更新 更多