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
补充一下:
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 matplotlibpip 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 = 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 我没搞懂啥格式.就是一串数字,但是 输入图像是多少,输出就写多少就没有问题.
偶然看文档发现:
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也可以支持
相关文章:
VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…...
Node.js 中的 fs 模块详解
fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...
debezium专栏文章目录
debezium专栏文章目录 第一阶段:基础认知篇 CDC革命:为什么说Debezium改变了数据流动方式? 对比Log-Based/Trigger-Based/Query-Based CDC方案Debezium在数据管道中的战略价值 5分钟部署你的第一个Debezium连接器 使用Docker Compose快速搭…...
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 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统,…...
Debezium 报错:“The db history topic is missing” 的处理方法
Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL检测报告标准讲解: 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
Windows隐藏窗口/开机自启动
目录 使用Start-Process命令控制窗口状态 设置程序开机自启动 使用Start-Process命令控制窗口状态 隐藏窗口运行程序 使用Start-Process命令时,可以通过-WindowStyle Hidden参数让程序在后台运行,窗口不可见。例如: Start-Process D:\note…...
汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
故障现象 一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...
文件IO(20250217)
1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...
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 项目。以下是一…...
ES6相关操作(2)
一.Promise Promise是ES6引入的异步编程工具。 语法上Promise是一个构造函数,用于封装异步操作并可以获取操作成功或失败的结果 Promise构造函数:Promise(excutor){} Promise的常用函数:then,catch 实例化Promise对象(创建Promise工具) let data"请求数据"//该数据为…...
成员函数定义后面加const是什么功能:C++中const成员函数的作用
成员函数定义后面加const是什么功能:C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中,有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…...
DeepSeek智能测试助手:分类+推理+导出一站式工具
前言 测试开发工程师在日常工作中需要处理大量测试文档,并且这些文档需要被高效分类、清洗和管理,同时结合强大的 AI 推理能力(如 DeepSeek 模型)进行智能化处理和分析。为此,我们开发了一款基于 PyQt5 的 GUI 工具&a…...
【嵌入式Linux应用开发基础】进程间通信(3):共享内存
目录 一、共享内存核心概念 1.1. 特点 1.2. 适用场景 二、共享内存原理剖析 三、嵌入式 Linux 中共享内存的使用 3.1. 相关函数介绍 3.2. System V共享内存操作步骤 3.3. 同步机制(示例使用System V信号量) 3.4. POSIX共享内存(现代…...
日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”
日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……” 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)寒くなりました & 元気になりました(2)何(なに)になりたいですか。(…...
计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python HTTP 请求工具类 HttpUtils:简化 HTTP 请求的高效工具
在现代的 Web 开发和 API 集成中,HTTP 请求是最常见的操作之一。无论是获取数据、提交表单,还是与 RESTful API 交互,我们都需要频繁地发送 HTTP 请求。为了简化这些操作,提升代码的可读性和可维护性,我们可以使用一个…...
「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…...
【linux】文件与目录命令 - grep
文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项5. 正则表达式5.1 正则表达式元字符5.2 正则表达式常用修饰符5.3 正则表达式运算符优先级5.4 正则表达式匹配规则 grep 命令用于在文本文件或标准输入中查找匹配的字符串模式,是一种功能强大的文本搜索工具&a…...
2025鸿蒙开发面试题汇总——通俗易懂
问题和通俗易懂的答案,覆盖鸿蒙开发的核心知识点和实际场景,方便面试时快速评估候选人能力: 一、基础概念(必问) 鸿蒙和安卓最大的区别是什么?举个实际例子。 答案:鸿蒙是“分布式操作系统”&am…...
专利申请流程详解:从创意到授权的完整指南
引言 专利是保护发明创造的重要法律工具,能够为发明人提供独占权,防止他人未经许可使用、制造或销售其发明。无论是个人发明者还是企业,了解专利申请流程都是至关重要的。本文将详细介绍专利申请的完整流程,帮助你从创意到授权&a…...
编写测试计划的六大要素是什么
编写测试计划时,一般需要包括以下六大要素,确保测试工作的完整性和可执行性: 1. 测试目标(Test Objectives) 明确测试的目的,如: 确保系统符合业务需求和技术要求。发现并修复软件缺陷。验证性…...
日期类(完全讲解版)
1. 类的设计思想 Date 类的设计目的是为了封装和处理日期信息,它提供了对日期的基本操作,如日期加减、日期比较、日期合法性检查等。类中的私有成员 int _year, int _month, int _day 存储了日期的年、月、日。 类的声明和构造 Date 类的声明࿱…...
Python网络爬虫技术详解文档
Python网络爬虫技术详解文档 目录 网络爬虫概述爬虫核心技术解析常用Python爬虫库实战案例演示反爬虫机制与应对策略爬虫法律与道德规范高级爬虫技术资源推荐与学习路径1. 网络爬虫概述 1.1 什么是网络爬虫 网络爬虫(Web Crawler)是一种按特定规则自动抓取互联网信息的程序…...
解决服务器上运行YOLO时字体问题
问题描述:运行YOLO时,需要Arial.ttf,由于网络较差,可以先将字体下载到本地,再上传到服务器。 下载地址:项目首页 - Arial字体资源文件下载:本仓库提供了一系列Arial字体的ttf格式文件下载。Arial字体是一种广泛使用的无衬线字体&…...
洛谷 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…...
DeepSeek系列模型发展:从LLM到V3、R1的技术突破与优化各阶段的重要论文汇总(附下载地址)
DeepSeek 系列模型从最初的 LLM 版本发展到最新的 V3 和 R1 版本,在架构设计、训练效率和推理能力方面不断取得进步。以下是各版本按时间倒序的详细信息: 1. DeepSeek-R1 发布时间:2025年1月 论文标题:DeepSeek-R1: Incentivizi…...
