VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验

news2025/2/21 13:31:38

最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午.

发现4.4支持python脚本,好开心.

首先安装VM4.4 注意一定要是4.4

打开后拖了一个模块.

但是发现import numpy import cv2 都报错.

python没有这些怎么玩? 咱好歹自学过几天python 不能放弃吧?

于是抱着试一试的态度?

开始以为路径是

C:\Program Files\VisionMaster4.4.0\Applications\Module(sp)\x64\Logic\PyShellModule

后来搜索感觉是这里:

C:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64

python.exe

C:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64\Scripts
pip.exe

补充一下:

C:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64\Scripts

这个目录是空的 需要双击执行get-pip.py等待文件下载完毕 里面才会出现 pip.exe等文件

好了,在这里按住shift右击 >>在此处打开powershell窗口 输入cmd

然后 尝试性的在此文件夹里 pip install numpy 当运行 import numpy as np 发现已经不报错了.

好了 现在直接在这个窗口:安装

pip install numpy
pip install opencv-python
pip install opencv-contrib-python
pip install pillow
pip install matplotlib

pip install numpy pillow opencv-python opencv-contrib-python matplotlib
# 我暂时只需要这么多 够用 你也可以安装别的

当然halcon装不了:强制安装也会报错:如下所示:

C:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64\Scripts>pip install mvtec-halcon==23050
ERROR: Ignored the following versions that require a different python version: 20110.0.0 Requires-Python >=3.8; 20110.0.1 Requires-Python >=3.8; 20111.0.0 Requires-Python >=3.8; 20111.0.1 Requires-Python >=3.8; 20112.0.0 Requires-Python >=3.8; 20113.0.0 Requires-Python >=3.8; 20114.0.0 Requires-Python >=3.8; 21050.0.0 Requires-Python >=3.8; 21110.0.0 Requires-Python >=3.8; 22050.0.0 Requires-Python >=3.8; 22110.0.0 Requires-Python >=3.8; 22110.0.1 Requires-Python >=3.8; 22111.0.0 Requires-Python >=3.8; 22111.0.1 Requires-Python >=3.8; 22112.0.0 Requires-Python >=3.8; 22112.0.1 Requires-Python >=3.8; 22113.0.1 Requires-Python >=3.8; 23050.0.0 Requires-Python >=3.8; 23110.0.0 Requires-Python >=3.8; 23110.0.1 Requires-Python >=3.8; 24050.0.0 Requires-Python >=3.8; 24111.0.0 Requires-Python >=3.8
ERROR: Could not find a version that satisfies the requirement mvtec-halcon==23050 (from versions: none)
ERROR: No matching distribution found for mvtec-halcon==23050

意味着必须3.8才能安装python版的halcon实在是非常遗憾. 官方能不能把你python版本升级到3.8呢?????????? 卡一个版本 气死人.    这个后面再想想别的办法.试试看能不能补救. 实在不行只能pythonnet 用halcon的.net接口了. 或者加强反馈等官方更新.

哈哈:

接下来又遇到难题:

官方文档只介绍输入输出图像的结构体: 没有示例程序.难搞.

结构体定义如下:

# 图像数据
class ImageData:
    def __init__(self):
        self.width = None
        self.height = None
        self.pixel_format = None
        self.buffer = None
        self.dataLen = None

其他类型 数据结构比较简单 见名知意: 好吧还是放出来吧:

# 路径 文件名
#C:\Program Files\VisionMaster4.4.0\Applications\Module(sp)\x64\Logic\PyShellModule
#组合数据类型字段定义.py


# ROI圆环
class RoiAnnulus:
    def __init__(self):
        self.center_x = None
        self.center_y = None
        self.inner_radius = None
        self.outer_radius = None
        self.start_angle = None
        self.angle_extend = None


# 圆
class Circle:
    def __init__(self):
        self.radius = None
        self.center_x = None
        self.center_y = None

# 椭圆
class ELLIPSE:
    def __init__(self):
        self.center_x = None
        self.center_y = None
        self.major_radius = None
        self.minor_radius = None
        self.angle = None

# 位置修正信息
class Fixture:
    def __init__(self):
        self.init_point_x = None
        self.init_point_y = None
        self.init_angle = None
        self.init_scale_x = None
        self.init_scale_y = None
        self.run_point_x = None
        self.run_point_y = None
        self.run_angle = None
        self.run_scale_x = None
        self.run_scale_y = None

# 图像数据
class ImageData:
    def __init__(self):
        self.width = None
        self.height = None
        self.pixel_format = None
        self.buffer = None
        self.dataLen = None

# 直线
class Line:
    def __init__(self):
        self.start_point_x = None
        self.start_point_y = None
        self.end_point_x = None
        self.end_point_y = None

# 点
class Point:
    def __init__(self):
        self.point_x = None
        self.point_y = None

# 轮廓
class PointSet:
    def __init__(self):
        self.buffer = None
        self.dataLen = None

# 矩形
class Rect:
    def __init__(self):
        self.rect_x = None
        self.rect_y = None
        self.width = None
        self.height = None

# Box
class RoiBox:
    def __init__(self):
        self.center_x = None
        self.center_y = None
        self.width = None
        self.height = None
        self.angle = None

# 多边形
class RoiPolygon:
    def __init__(self):
        self.point_num = None
        self.point_x = None
        self.point_y = None

# 圆环
class Annulus:
    def __init__(self):
        self.center_x = None
        self.center_y = None
        self.inner_radius = None
        self.outer_radius = None
        self.start_angle = None
        self.angle_extend = None

直接上程序: 自己摸索的 输入输出 官方可没有示例 噢

# coding: utf-8
from ioHelper import *

# pip install opencv-python
# pip install numpy

import os,sys,time
import cv2
import numpy as np

def Imagetonumpy(ImageData):
    # 将二进制数据转换为 NumPy 数组
    image_array = np.frombuffer(ImageData.buffer, dtype=np.uint8)
    # 调整数组形状为 (height, width, channels) # 图是3 通道 就选3 1通道就选1
    if (int(len(ImageData.buffer)) == int(ImageData.width*ImageData.height)):
        channels=1
    else:
        channels=3
    image_array = image_array.reshape((ImageData.height, ImageData.width,channels))
    if channels==3:
    	image_array = cv2.cvtColor(image_array, cv2.COLOR_RGB2BGR)
    return image_array
#*******************************************************************************************
def numpytoImage(numpy_image):
    """
    将 NumPy 数组转换为 ImageData 结构体。
    参数:
        numpy_image: NumPy 数组,形状为 (height, width, channels) 或 (height, width)。
    返回:
        ImageData: 包含图像数据的结构体。
    """
    # 检查 NumPy 数组的形状
    if len(numpy_image.shape) == 1:  # 灰度图像
        height, width,channels = numpy_image.shape
        channels = 1
    elif len(numpy_image.shape) == 3:  # 彩色图像
        height, width, channels = numpy_image.shape
    else:
        raise ValueError("NumPy 数组形状不正确!")
    if channels == 3:
        numpy_image = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
    buffer = numpy_image.tobytes()# 将 NumPy 数组转换为二进制数据
    # 创建 ImageData 结构体
    image_data = ImageData()
    image_data.width = width
    image_data.height = height
    if channels == 3:
        image_data.pixel_format =  35127316 # 假设像素格式与原函数一致 35127316 
    if channels == 1:    
        image_data.pixel_format = 17301505  # 假设像素格式与原函数一致 35127316 
    image_data.buffer = buffer
    image_data.dataLen = width*height*channels
    
    
    #image_data.pixel_format 必须正确 否则图像报错  我也不知带这个是啥格式啥结构 
	# 但是可以通过 输入图像 tmpimg.pixel_format 获取 这个数值
	
    #localVar = IoHelper(data, INIT_LOCAL_VAR)
    #tmpimg = moduleVar.img #读取图像
    #{tmpimg.width}// 宽度 759
    #{tmpimg.height}//高度 658
    #{tmpimg.pixel_format}
    return image_data   
   
def Process(data) -> int:
    """Write custom logic code inside the Process method. Return 0 for success or any other value for failure."""
    """在Process方法内编写自定义逻辑代码, 成功返回0, 返回其他值表示失败"""
    
    """Do not delete this code block."""
    """请勿删除此处代码"""
    moduleVar = IoHelper(data, INIT_MODULE_VAR)
    globalVar = IoHelper(data, INIT_GLOBAL_VAR)
    localVar = IoHelper(data, INIT_LOCAL_VAR)
    
    tmpimg = moduleVar.img #读取图像
    moduleVar.outstr = fr"""
    {tmpimg.width}// 宽度 759
    {tmpimg.height}//高度 658
    {tmpimg.pixel_format}//像素格式 //35127316
    [tmpimg.buffer]//图像数据  二进制
    {tmpimg.dataLen}//数据长度 //1498266
    {os.getcwd()}
	{int(len(tmpimg.buffer))}
    {int(tmpimg.width*tmpimg.height)}
    {int(len(tmpimg.buffer)) == int(tmpimg.width*tmpimg.height)}
    """
    

    image_array=Imagetonumpy(tmpimg)
    
    
    
    #image = cv2.imread(tmpimg)
    
	# 使用 OpenCV 显示图像
    #blank_image = np.ones((200, 200, 1), dtype=np.uint8) * 255
    #numpy_image = np.zeros((100,100,3),dtype=np.uint8)
    #cv2.imshow("Image", image_array)
    #cv2.waitKey(2000)
    #cv2.destroyAllWindows()
	

    imgooop=numpytoImage(image_array)
    
    
    moduleVar.imgout=imgooop
    
    
    """Variable initialization, to access input and output variables within the Process method."""
    """变量初始化, 进入Process方法后首先调用, 否则无法访问输入、输出变量"""
    """
    
    * Input and output variables:
    * 输入、输出变量
    
    
    
    Input variables are read-only and cannot be modified; output variables are write-only and cannot be read.
    输入变量为只读, 不可以修改; 输出变量为只写, 不可以读取;
    Assume: the name of the input variable is 'in0', of type int. Its value can be obtained using tmp = moduleVar.in0
    假设: 输入变量名为in0, 类型为int, 可通过tmp = moduleVar.in0 读取该变量的值
    Assume: the name of the output variable is 'out0', of type int. Its value can be set using moduleVar.out = 9
    假设: 输出变量名为out0, 类型为int, moduleVar.out = 9 设置该变量的值
    Global variables:
    * 全局变量
    Assume: the name of the global variable is 'var0', of type int. Its value can be obtained using tmp = globalVar.GetValue('var0')
    假设: 输入变量名为var0, 类型为int, 可通过tmp = globalVar.GetValue('var0') 读取该变量的值, 通过 globalVar.SetValue('var0', 123) 设置该变量的值
    Local variables:
    * 局部变量
    Assume: the name of the local variable is 'var0', of type int. Its value can be obtained using tmp = localVar.GetValue('var0')
    假设: 输入变量名为var0, 类型为int, 可通过tmp = localVar.GetValue('var0') 读取该变量的值, 通过 localVar.SetValue('var0', 123) 设置该变量的值

    ** All variables should be used strictly based on their types. If there is a need for type conversion, explicit conversion should be performed in the user code.
    ** 所有变量都需要严格根据变量类型使用, 若有类型转换的需求, 应在用户代码内通过显示转换代码进行类型转换。
    
    Example code:
    示例代码如下:
    width = moduleVar.width + 100
    moduleVar.out0 = width / 2 + 20

    if moduleVar.in1 == 'OK':
        moduleVar.out1 = "OK"

    moduleVar.out0 = globalVar.GetValue('var0')
    moduleVar.out1 = localVar.GetValue('var0')
    globalVar.SetValue('var1', 123)
    localVar.SetValue('var1', moduleVar.out2)
    
    Note: Python indentation must be 4 spaces
    注意: Python的缩进必须为4个空格。
    
    编写自定义代码,替换下方的默认代码 pass
    Write custom code to replace the default code below."
    """
    
    

   
    
    try:
        #PrintMsg("\nUser code start")
        pass
        #PrintMsg("User code end")
    except BaseException as e:
        PrintMsg(e)
    return 0

 仔细看 就是2个转换函数: process是被调用方

注意 tmpimg.pixel_format 我没搞懂啥格式.就是一串数字,但是 输入图像是多少,输出就写多少就没有问题.

偶然看文档发现:

file:///C:/Program%20Files/VisionMaster4.4.0/Applications/Help/CH/index.html
浏览 帮助文档 看到了介绍:
帮助文档里面>颜色处理>彩图生成>输出图像像素格式:
int型,代表输出图像的像素格式。其中17301505对应Mono8格式,35127316对应RGB24格式。
那么 意味着 程序 可以没有问题.

美中不足的是VM 用的 python3.7 64位 如果是python3.8 那么python 版本的halcon也可以支持 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-leetcode 40.二叉树的层序遍历

题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…

蓝桥杯学习大纲

(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:

水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL检测报告标准讲解: 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素&#xf…

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI,你可以执行以下命令: yarn global add vue/cli这个命令会全局安装 Vue CLI,让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能:C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中,有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…

DeepSeek智能测试助手:分类+推理+导出一站式工具

前言 测试开发工程师在日常工作中需要处理大量测试文档,并且这些文档需要被高效分类、清洗和管理,同时结合强大的 AI 推理能力(如 DeepSeek 模型)进行智能化处理和分析。为此,我们开发了一款基于 PyQt5 的 GUI 工具&a…

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…

日期类(完全讲解版)

1. 类的设计思想 Date 类的设计目的是为了封装和处理日期信息,它提供了对日期的基本操作,如日期加减、日期比较、日期合法性检查等。类中的私有成员 int _year, int _month, int _day 存储了日期的年、月、日。 类的声明和构造 Date 类的声明&#xff1…

洛谷 P10726 [GESP202406 八级] 空间跳跃 C++ 完整题解

一、题目链接 P10726 [GESP202406 八级] 空间跳跃 - 洛谷 二、解题思路 我们要对输入的挡板进行排序,按高度从高到低(从小到大)。 排序之后s和t都要更新。 struct Baffle {int l, r;int h;int id; } b[1005];void Sort() {sort(b 1, b 1 n…

【设计模式精讲】创建型模式之工厂方法模式(简单工厂、工厂方法)

文章目录 第四章 创建型模式4.2 工厂方法模式4.2.1 需求: 模拟发放奖品业务4.2.2 原始开发方式4.2.3 简单工厂模式4.2.3.1 简单工厂模式介绍4.2.3.2 简单工厂原理4.2.3.3 简单工厂模式重构代码4.2.3.4 简单工厂模式总结 4.2.4 工厂方法模式4.2.4.1 工厂方法模式介绍4.2.4.2 工厂…

【ROS2】【ROS2】RViz2源码分析(八):Display中订阅ROS2消息(使用Qt信号和槽传递ROS2消息)

1、简述 RViz2 涵盖了 Qt 和 ROS2 的技术点,前面介绍 DisplaysPanel 时,主要分析了Qt相关部分,参见博客: 【ROS2】RViz2源码分析(七):DisplaysPanel 中的树状模型/视图 本篇博客,将会一起学习 RViz2 中如何使用 ROS2,以 Display 中订阅 ROS2 消息为例。 2、通过话题…

牛顿法:用泰勒级数求解平方根的秘籍

目录 一、引言二、牛顿法的理论基础——泰勒级数三、牛顿法的原理与推导3.1 原理概述3.2 推导过程3.3 几何解释 四、牛顿法的应用场景4.1 数值计算4.2 优化问题 五、牛顿法求平方根的具体案例5.1 原理推导5.2 具体步骤5.3 代码实现(Python)5.4 示例计算过…

Unity 打开摄像头 并显示在UI

需求: 打开相机并显示在UI上 效果: 注意: 电脑可能有多个摄像头,注意名称 代码: using System; using System.Linq; using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor; #endifname…

RK Android11 WiFi模组 AIC8800 驱动移植流程

RK Android WiFi模组 AIC8800 驱动移植流程 作者:Witheart更新时间:20250220 概要:本文介绍了基于 AIC8800D40 芯片的 WiFi6 模组 BL-M8800DS2-40 在 RK3568 平台上的驱动移植流程。主要涉及环境搭建、驱动代码分析、设备树修改、驱动编译配…

Windows PyCharm的python项目移动存储位置后需要做的变更

项目使用的venv虚拟环境,因此项目移动存储位置后需要重新配置python解释器的位置,否则无法识别,若非虚拟环境中运行,则直接移动后打开即可,无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition),其…

浅棕色人像花卉照片Lr调色,手机滤镜PS+Lightroom预设下载!

调色介绍 提供一系列用于处理浅棕色调人像与花卉照片的后期预设资源,这些预设兼容手机滤镜的 PS 和 Lightroom 软件。其主要作用是令照片达成浅棕色的色调效果,帮助使用者快捷地对人像和花卉照片进行调色处理,无需繁复手动调节参数&#xff0…

POI pptx转图片

前言 ppt页面预览一直是个问题&#xff0c;office本身虽然有预览功能但是收费&#xff0c;一些开源的项目的预览又不太好用&#xff0c;例如开源的&#xff1a;kkfileview pptx转图片 1. 引入pom依赖 我这个项目比较老&#xff0c;使用版本较旧 <dependency><gro…