opencv添加自定义函数

Opencv python自定义函数,要求和halcon中算子一样简单调用

不太理解你为什么要跟halcon算子一样做调用选择。opencv自定义的函数和操作本来就挺容易,这是给你的一个例子:

import cv2

def my_custom_function(image):
    processed_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return processed_image

input_image = cv2.imread('input.jpg')
output_image = my_custom_function(input_image)

cv2.imshow('Input Image', input_image)
cv2.imshow('Output Image', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()


在OpenCV中,你可以通过定义Python函数来创建自定义的图像处理函数。这些函数可以使用OpenCV提供的各种图像处理函数,也可以包含你自己的算法和逻辑。

以下是一个简单的例子,这个函数将输入的图像转换为灰度图像:

import cv2

def convert_to_gray(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

你可以像调用任何其他Python函数一样调用这个函数:

image = cv2.imread('image.jpg')
gray_image = convert_to_gray(image)

如果你想创建更复杂的函数,你可以在你的函数中使用更多的OpenCV函数,也可以添加更多的参数来控制你的函数的行为。例如,以下的函数将输入的图像转换为灰度图像,然后使用Canny算子进行边缘检测:

def detect_edges(image, low_threshold, high_threshold):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray_image, low_threshold, high_threshold)
    return edges

你可以像这样调用这个函数:

image = cv2.imread('image.jpg')
edges = detect_edges(image, 100, 200)

这样,你就可以创建自己的OpenCV函数,使你的代码更加清晰和易于维护。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7438539
  • 你也可以参考下这篇文章:使用Opencv实现Halcon中的动态阈值
  • 除此之外, 这篇博客: Python+OpenCV 识别Halcon标定板圆并将圆心坐标写入文件中的 注释: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1.medianBlur()函数:使用中值滤波器来平滑图像。
    dst = cv2.medianBlur(src, ksize[, dst])-----该函数使用具有ksize*ksize孔径大小的中值滤波器来平滑图像。对多通道图像的各通道独立处理。支持in-place操作。
    在边界类型( BorderTypes)方面,使用的是 BORDER_REPLICATE 。
    2.python关于图片二值化在图片中已有详细注释,补充内容可参考此文章:https://blog.csdn.net/sinat_21258931/article/details/61418681
    3.开运算闭运算可参考此文章:https://blog.csdn.net/caojinpei123/article/details/81916005
    4.腐蚀:会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
    膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。

    """
    腐蚀
    cv2.erode(src,                     # 输入图像
       kernel,                  # 卷积核
       dst=None, 
       anchor=None,
       iterations=None,         # 迭代次数,默认1
       borderType=None,
       borderValue=None)
    膨胀
    cv2.dilate(src,                      #输入图像
        kernel, dst = None, anchor = None,
        iterations = None          #迭代次数,默认1
        borderType = None,
        borderValue = None)
    """

    5.cv2.Canny()函数,
    函数原型是这样的:edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
    image参数表示8位输入图像。
    threshold1参数表示设置的低阈值minVal。
    threshold2参数表示设置的高阈值maxVal,一般设定为低阈值的3倍 (根据Canny算法的推荐)。
    edges参数表示输出边缘图像,单通道8位图像。
    apertureSize参数表示Sobel算子(卷积核)的大小。
    L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。
    6.霍夫变换检测圆原理
    7.霍夫变换检测圆函数:
    cv.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
    image:为输入图像,要求是灰度图像
    method:为使用霍夫变换圆检测的算法
    dp:用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,此参数允许创建一个比输入图像分辨率低的累加器。例如,如果dp = 1时,累加器和输入图像具有相同的分辨率。如果dp = 2,累加器便有输入图像一半那么大的宽度和高度,为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半。一般默认为1
    minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心,(太大的话,会很多圆被认为是一个圆)
    circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径).(可省略)
    param1:阈值。第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下, 两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍)。一般默认为100
    param2:阈值。第二种方法参数。在CV_HOUGH_GRADIENT的情况下 ,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。(圆越小设置越小,检测的圆越多,但检测大圆会有噪点)
    minRadius:所检测到的圆半径的最小值
    maxRadius:所检测到的圆半径的最大值
    8.画出圆和圆心,并写入文件(详见注释)
    9.Python文件操作说明

  • 您还可以看一下 唐宇迪老师的Opencv计算机视觉实战(Python版)课程中的 计算机眼中的图像(数据代码下载请点击------------->)小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    要在OpenCV中添加自定义函数并实现简单调用,需要遵循以下步骤: 1. 定义自己的自定义函数,例如:

    double myFunction(double a, double b) {
        return a + b;
    }
    
    1. 在需要调用该函数的地方,添加函数声明,例如:
    double myFunction(double a, double b);
    
    1. 调用自定义函数,例如:
    double result = myFunction(1.0, 2.0);
    cout << "The result is: " << result << endl;
    

    需要注意的是,自定义函数必须与OpenCV的数据类型和函数兼容,否则会出现编译错误。确保函数声明和调用都是在正确的位置和上下文中进行,以避免命名冲突或作用域错误。

    以下是一个完整的示例程序,该程序定义了自定义函数myFunction,并在main函数中调用该函数来计算两个数字的和:

    #include <iostream>
    #include <opencv2/core.hpp>
    
    using namespace std;
    using namespace cv;
    
    double myFunction(double a, double b) {
        return a + b;
    }
    
    int main() {
        double x = 1.0, y = 2.0;
        double result = myFunction(x, y);
        cout << "The result is: " << result << endl;
        return 0;
    }
    

    以上代码中,在头文件opencv2/core.hpp之后,我们定义了一个简单的自定义函数myFunction,它接受两个double类型的参数,将它们相加并返回和。我们在main函数中使用两个变量xy作为参数,调用该函数,并将结果打印到控制台上。

    该程序输出The result is: 3,这是自定义函数myFunction计算1.0和2.0的和的结果。

    使用这个示例程序作为模板,你可以定义自己的自定义函数,根据需要修改参数和返回值的类型和计算逻辑,然后在OpenCV中实现简单调用。