VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
最近有接触过一丢丢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\x64python.exeC:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64\Scripts
pip.exe
好了,在这里按住shift右击 >>在此处打开powershell窗口 输入cmd
然后 尝试性的在此文件夹里 pip install numpy 当运行 import numpy as np 发现已经不报错了.
好了 现在直接在这个窗口:安装
pip install numpy
pip install opencv-python
pip install pillow
pip install matplotlib
# 我暂时只需要这么多 够用 你也可以安装别的
哈哈:
接下来又遇到难题:
官方文档只介绍输入输出图像的结构体: 没有示例程序.难搞.
结构体定义如下:
# 图像数据
class ImageData:def __init__(self):self.width = Noneself.height = Noneself.pixel_format = Noneself.buffer = Noneself.dataLen = None
其他类型 数据结构比较简单 见名知意: 好吧还是放出来吧:
# 路径 文件名
#C:\Program Files\VisionMaster4.4.0\Applications\Module(sp)\x64\Logic\PyShellModule
#组合数据类型字段定义.py# ROI圆环
class RoiAnnulus:def __init__(self):self.center_x = Noneself.center_y = Noneself.inner_radius = Noneself.outer_radius = Noneself.start_angle = Noneself.angle_extend = None# 圆
class Circle:def __init__(self):self.radius = Noneself.center_x = Noneself.center_y = None# 椭圆
class ELLIPSE:def __init__(self):self.center_x = Noneself.center_y = Noneself.major_radius = Noneself.minor_radius = Noneself.angle = None# 位置修正信息
class Fixture:def __init__(self):self.init_point_x = Noneself.init_point_y = Noneself.init_angle = Noneself.init_scale_x = Noneself.init_scale_y = Noneself.run_point_x = Noneself.run_point_y = Noneself.run_angle = Noneself.run_scale_x = Noneself.run_scale_y = None# 图像数据
class ImageData:def __init__(self):self.width = Noneself.height = Noneself.pixel_format = Noneself.buffer = Noneself.dataLen = None# 直线
class Line:def __init__(self):self.start_point_x = Noneself.start_point_y = Noneself.end_point_x = Noneself.end_point_y = None# 点
class Point:def __init__(self):self.point_x = Noneself.point_y = None# 轮廓
class PointSet:def __init__(self):self.buffer = Noneself.dataLen = None# 矩形
class Rect:def __init__(self):self.rect_x = Noneself.rect_y = Noneself.width = Noneself.height = None# Box
class RoiBox:def __init__(self):self.center_x = Noneself.center_y = Noneself.width = Noneself.height = Noneself.angle = None# 多边形
class RoiPolygon:def __init__(self):self.point_num = Noneself.point_x = Noneself.point_y = None# 圆环
class Annulus:def __init__(self):self.center_x = Noneself.center_y = Noneself.inner_radius = Noneself.outer_radius = Noneself.start_angle = Noneself.angle_extend = None
直接上程序: 自己摸索的 输入输出 官方可没有示例 噢
# coding: utf-8
from ioHelper import *# pip install opencv-python
# pip install numpyimport os,sys,time
import cv2
import numpy as npdef Imagetonumpy(ImageData):# 将二进制数据转换为 NumPy 数组image_array = np.frombuffer(ImageData.buffer, dtype=np.uint8)# 调整数组形状为 (height, width, channels) # 图是3 通道 就选3 1通道就选1if (int(len(ImageData.buffer)) == int(ImageData.width*ImageData.height)):channels=1else:channels=3image_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.shapechannels = 1elif len(numpy_image.shape) == 3: # 彩色图像height, width, channels = numpy_image.shapeelse: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 = widthimage_data.height = heightif channels == 3:image_data.pixel_format = 35127316 # 假设像素格式与原函数一致 35127316 if channels == 1: image_data.pixel_format = 17301505 # 假设像素格式与原函数一致 35127316 image_data.buffer = bufferimage_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 + 100moduleVar.out0 = width / 2 + 20if 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个空格。编写自定义代码,替换下方的默认代码 passWrite 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 我没搞懂啥格式.就是一串数字,但是 输入图像是多少,输出就写多少就没有问题.
美中不足的是VM 用的 python3.7 64位 如果是python3.8 那么python 版本的halcon也可以支持
相关文章:

VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…...

线程池的使用 + MD5加密 + 枚举类
文章目录 1、线程池的使用2、MD5算法的使用3、多用枚举类 整理下近期干活儿遇到的一些坑。 1、线程池的使用 不合理点1:jstack线程转储发现,有几万个线程,查看代码发现,线程池放在方法内部或者循环体中创建,尽管方法…...

[qt5学习笔记]Application Example示例程序源码解析
开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图, 设置designer独立运行。估计是嵌入运行存在些许bug。 同理,ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常,但分离式更稳定可靠。 qt creator编译失败 原…...
【在时光的棋局中修行——论股市投资的诗意哲学】
在时光的棋局中修行——论股市投资的诗意哲学 引子:数字之海与星辰之约 在经纬交织的K线图里,我常看见银河倾泻的轨迹。那些跳动的数字如同繁星坠落,在午夜时分编织着财富的密码。炒股之道,是理性与诗意的交响,是数据…...
IB网络错误检查工具ibqueryerrors
ibqueryerrors 是一个用于查询 InfiniBand 网络中错误统计信息的工具。它可以帮助网络管理员识别和诊断网络问题,如丢包、重传和其他通信错误。这个工具通常是 InfiniBand 管理软件包的一部分,例如 OpenSM(Open Subnet Manager)。…...

「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...

论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?
端到端的强势来袭,好久了~~~ 简单翻译:端到端真的需要感知任务嘛? code https://github.com/PeidongLi/SSR. https://arxiv.org/pdf/2409.18341 1. 摘要 端到端自动驾驶(E2EAD)方法通常依赖于监督式感知任务来提取显…...

25年黑龙江省考报名流程详细教程
2025年黑龙江省考报名马上就要开始报名啦! 有想要参加黑龙江省考报名的同学,可以提前了解一下考试报名流程,熟悉考试报名照要求! 一、考试时间安排 报名时间:2月18日9:00至2月23日17:00 缴费时间:2月18日…...

基于SpringBoot的小区运动中心预约管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
部署postgresql_exporter监控pgsql
部署exporter配置监控job配置告警规则 一键部署脚本 #!/bin/bash# 定义变量 PG_HOST"xx.ap-southeast-1.rds.amazonaws.com" PG_PORT"5432" PG_PASSWORD"bagayalu321" PG_USER"monitor_user" EXPORTER_VERSION"0.16.0" #…...

Mac本地部署deepseek
Ollama 运行deepseek需要本地运行工具ollama,安装路径如下 ollama官方网站 (https://ollama.com/download) 下载Mac版ollama,点击移至application下面 DeepSeek R1 14b 通过ollama安装deepseek,对应的运行指令可通过 deepseek本地部署列表…...

huggingface+下载deepseek8b lamda+本地部署 笔记
步骤倒过来 1.python hf_download.py --model unsloth/DeepSeek-R1-Distill-Llama-8B-GGUF model后加模型名(HF-Mirror中查) 【huggingface模型下载不下来?这里教你万能解决办法~huggingface小白使用指南。】 https://www.bilibili.com/video…...
中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?
今天给大家分享的是一位粉丝的提问,中上211硕对嵌入式AI感兴趣,如何有效规划学习路径? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 中上211,…...
Jedis 客户端 用于java连接redis服务
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId...

车载诊断数据库 --- 通用性诊断数据库ODX
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
docker 基础命令使用(ubuntu)
docker 状态查询 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作镜像命令 docker imagesdocker rmi 镜像id/镜像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 参数…...

IDEA集成DeepSeek
引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…...

Unity 接入Luabn记录图解
Luban 文档及链接项目目录UnityEditor 导表工具 文档及链接 官方文档 最新版本 项目目录 接入的方法有很多,我这里随便找了一种 https://gitee.com/focus-creative-games/luban_examples.git如上图,git拉去后,只保留圈起来的2个文件夹。…...

【MySQL】我在广州学Mysql 系列——Mysql 日志管理详解
ℹ️大家好,我是练小杰,今天又是新的一周了,又该摆好心态迎接美好的明天了!!!😆 本文主要对Mysql数据库中的日志种类以及基本命令进行讨论!! 回顾:Ǵ…...

【线段树 二分查找】P3939 数颜色|普及+
本文涉及知识点 C线段树 C二分查找 P3939 数颜色 题目背景 大样例可在页面底部「附件」中下载。 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 n n n 的 n n n 只兔…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...