hikrobot sc finally got the image

This commit is contained in:
gg 2025-01-22 16:25:39 +01:00
parent 404d9b7a28
commit 15decde342
2 changed files with 224 additions and 176 deletions

View File

@ -1,4 +1,5 @@
import ctypes
import json
import socket
import struct
from ctypes import *
@ -9,92 +10,104 @@ MV_VS_OK=0x00000000
CHUNK_MASK_IMAGE_PORT=60005536
CHUNK_RESULT_PORT=60005537
ImageExLen = 4096
MV_VS_GVSP_PIX_MONO = 0x01000000
MV_VS_GVSP_PIX_COLOR = 0x02000000
MV_VS_GVSP_PIX_CUSTOM = 0x80000000
MV_VS_GVSP_PIX_COLOR_MASK = 0xFF000000
MV_VS_GVSP_PIX_EFFECTIVE_PIXEL_SIZE_MASK = 0x00FF0000
MV_VS_GVSP_PIX_EFFECTIVE_PIXEL_SIZE_SHIFT = 16
MV_VS_GVSP_PIX_ID_MASK = 0x0000FFFF
MV_VS_GVSP_PIX_COUNT = 0x46
# Define the macro
def MV_VS_PIXEL_BIT_COUNT(n):
return (n) << 16
mv_lib = ctypes.windll.LoadLibrary("src/test/hikrobot_sc/bin/MvVisionSensorControl.dll")
# define structures
from ctypes import *
class MvVSGvspPixelType(c_int):
class MvVSGvspPixelType(ctypes.c_uint32): # Use c_uint32 for compatibility
MVVS_PixelType_Undefined = 0xFFFFFFFF
MVVS_PixelType_Mono1p = (0x0037)
MVVS_PixelType_Mono2p = (0x0038)
MVVS_PixelType_Mono4p = (0x0039)
MVVS_PixelType_Mono8 = (0x0001)
MVVS_PixelType_Mono8_Signed = (0x0002)
MVVS_PixelType_Mono10 = (0x0003)
MVVS_PixelType_Mono10_Packed = (0x0004)
MVVS_PixelType_Mono12 = (0x0005)
MVVS_PixelType_Mono12_Packed = (0x0006)
MVVS_PixelType_Mono14 = (0x0025)
MVVS_PixelType_Mono16 = (0x0007)
MVVS_PixelType_BayerGR8 = (0x0008)
MVVS_PixelType_BayerRG8 = (0x0009)
MVVS_PixelType_BayerGB8 = (0x000A)
MVVS_PixelType_BayerBG8 = (0x000B)
MVVS_PixelType_BayerGR10 = (0x000C)
MVVS_PixelType_BayerRG10 = (0x000D)
MVVS_PixelType_BayerGB10 = (0x000E)
MVVS_PixelType_BayerBG10 = (0x000F)
MVVS_PixelType_BayerGR12 = (0x0010)
MVVS_PixelType_BayerRG12 = (0x0011)
MVVS_PixelType_BayerGB12 = (0x0012)
MVVS_PixelType_BayerBG12 = (0x0013)
MVVS_PixelType_BayerGR10_Packed = (0x0026)
MVVS_PixelType_BayerRG10_Packed = (0x0027)
MVVS_PixelType_BayerGB10_Packed = (0x0028)
MVVS_PixelType_BayerBG10_Packed = (0x0029)
MVVS_PixelType_BayerGR12_Packed = (0x002A)
MVVS_PixelType_BayerRG12_Packed = (0x002B)
MVVS_PixelType_BayerGB12_Packed = (0x002C)
MVVS_PixelType_BayerBG12_Packed = (0x002D)
MVVS_PixelType_BayerGR16 = (0x002E)
MVVS_PixelType_BayerRG16 = (0x002F)
MVVS_PixelType_BayerGB16 = (0x0030)
MVVS_PixelType_BayerBG16 = (0x0031)
MVVS_PixelType_RGB8_Packed = (0x0014)
MVVS_PixelType_BGR8_Packed = (0x0015)
MVVS_PixelType_RGBA8_Packed = (0x0016)
MVVS_PixelType_BGRA8_Packed = (0x0017)
MVVS_PixelType_RGB10_Packed = (0x0018)
MVVS_PixelType_BGR10_Packed = (0x0019)
MVVS_PixelType_RGB12_Packed = (0x001A)
MVVS_PixelType_BGR12_Packed = (0x001B)
MVVS_PixelType_RGB16_Packed = (0x0033)
MVVS_PixelType_BGR16_Packed = (0x004B)
MVVS_PixelType_RGBA16_Packed = (0x0064)
MVVS_PixelType_BGRA16_Packed = (0x0051)
MVVS_PixelType_RGB10V1_Packed = (0x001C)
MVVS_PixelType_RGB10V2_Packed = (0x001D)
MVVS_PixelType_RGB12V1_Packed = (0X0034)
MVVS_PixelType_RGB565_Packed = (0x0035)
MVVS_PixelType_BGR565_Packed = (0X0036)
MVVS_PixelType_YUV411_Packed = (0x001E)
MVVS_PixelType_YUV422_Packed = (0x001F)
MVVS_PixelType_YUV422_YUYV_Packed = (0x0032)
MVVS_PixelType_YUV444_Packed = (0x0020)
MVVS_PixelType_YCBCR8_CBYCR = (0x003A)
MVVS_PixelType_YCBCR422_8 = (0x003B)
MVVS_PixelType_YCBCR422_8_CBYCRY = (0x0043)
MVVS_PixelType_YCBCR411_8_CBYYCRYY = (0x003C)
MVVS_PixelType_YCBCR601_8_CBYCR = (0x003D)
MVVS_PixelType_YCBCR601_422_8 = (0x003E)
MVVS_PixelType_YCBCR601_422_8_CBYCRY = (0x0044)
MVVS_PixelType_YCBCR601_411_8_CBYYCRYY = (0x003F)
MVVS_PixelType_YCBCR709_8_CBYCR = (0x0040)
MVVS_PixelType_YCBCR709_422_8 = (0x0041)
MVVS_PixelType_YCBCR709_422_8_CBYCRY = (0x0045)
MVVS_PixelType_YCBCR709_411_8_CBYYCRYY = (0x0042)
MVVS_PixelType_RGB8_Planar = (0x0021)
MVVS_PixelType_RGB10_Planar = (0x0022)
MVVS_PixelType_RGB12_Planar = (0x0023)
MVVS_PixelType_RGB16_Planar = (0x0024)
MVVS_PixelType_Jpeg = (0x0001)
MVVS_PixelType_Mono1p = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(1) | 0x0037)
MVVS_PixelType_Mono2p = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(2) | 0x0038)
MVVS_PixelType_Mono4p = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(4) | 0x0039)
MVVS_PixelType_Mono8 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x0001)
MVVS_PixelType_Mono8_Signed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x0002)
MVVS_PixelType_Mono10 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0003)
MVVS_PixelType_Mono10_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0004)
MVVS_PixelType_Mono12 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0005)
MVVS_PixelType_Mono12_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0006)
MVVS_PixelType_Mono14 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0025)
MVVS_PixelType_Mono16 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0007)
MVVS_PixelType_BayerGR8 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x0008)
MVVS_PixelType_BayerRG8 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x0009)
MVVS_PixelType_BayerGB8 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x000A)
MVVS_PixelType_BayerBG8 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(8) | 0x000B)
MVVS_PixelType_BayerGR10 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x000C)
MVVS_PixelType_BayerRG10 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x000D)
MVVS_PixelType_BayerGB10 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x000E)
MVVS_PixelType_BayerBG10 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x000F)
MVVS_PixelType_BayerGR12 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0010)
MVVS_PixelType_BayerRG12 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0011)
MVVS_PixelType_BayerGB12 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0012)
MVVS_PixelType_BayerBG12 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0013)
MVVS_PixelType_BayerGR10_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0026)
MVVS_PixelType_BayerRG10_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0027)
MVVS_PixelType_BayerGB10_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0028)
MVVS_PixelType_BayerBG10_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x0029)
MVVS_PixelType_BayerGR12_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x002A)
MVVS_PixelType_BayerRG12_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x002B)
MVVS_PixelType_BayerGB12_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x002C)
MVVS_PixelType_BayerBG12_Packed = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(12) | 0x002D)
MVVS_PixelType_BayerGR16 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x002E)
MVVS_PixelType_BayerRG16 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x002F)
MVVS_PixelType_BayerGB16 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0030)
MVVS_PixelType_BayerBG16 = (MV_VS_GVSP_PIX_MONO | MV_VS_PIXEL_BIT_COUNT(16) | 0x0031)
MVVS_PixelType_RGB8_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x0014)
MVVS_PixelType_BGR8_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x0015)
MVVS_PixelType_RGBA8_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(32) | 0x0016)
MVVS_PixelType_BGRA8_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(32) | 0x0017)
MVVS_PixelType_RGB10_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0018)
MVVS_PixelType_BGR10_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0019)
MVVS_PixelType_RGB12_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x001A)
MVVS_PixelType_BGR12_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x001B)
MVVS_PixelType_RGB16_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0033)
MVVS_PixelType_BGR16_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x004B)
MVVS_PixelType_RGBA16_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(64) | 0x0064)
MVVS_PixelType_BGRA16_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(64) | 0x0051)
MVVS_PixelType_RGB10V1_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(32) | 0x001C)
MVVS_PixelType_RGB10V2_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(32) | 0x001D)
MVVS_PixelType_RGB12V1_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(36) | 0x0034)
MVVS_PixelType_RGB565_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0035)
MVVS_PixelType_BGR565_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0036)
MVVS_PixelType_YUV411_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(12) | 0x001E)
MVVS_PixelType_YUV422_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x001F)
MVVS_PixelType_YUV422_YUYV_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0032)
MVVS_PixelType_YUV444_Packed = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x0020)
MVVS_PixelType_YCBCR8_CBYCR = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x003A)
MVVS_PixelType_YCBCR422_8 = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x003B)
MVVS_PixelType_YCBCR422_8_CBYCRY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0043)
MVVS_PixelType_YCBCR411_8_CBYYCRYY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(12) | 0x003C)
MVVS_PixelType_YCBCR601_8_CBYCR = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x003D)
MVVS_PixelType_YCBCR601_422_8 = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x003E)
MVVS_PixelType_YCBCR601_422_8_CBYCRY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0044)
MVVS_PixelType_YCBCR601_411_8_CBYYCRYY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(12) | 0x003F)
MVVS_PixelType_YCBCR709_8_CBYCR = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x0040)
MVVS_PixelType_YCBCR709_422_8 = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0041)
MVVS_PixelType_YCBCR709_422_8_CBYCRY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(16) | 0x0045)
MVVS_PixelType_YCBCR709_411_8_CBYYCRYY = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(12) | 0x0042)
MVVS_PixelType_RGB8_Planar = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(24) | 0x0021)
MVVS_PixelType_RGB10_Planar = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0022)
MVVS_PixelType_RGB12_Planar = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0023)
MVVS_PixelType_RGB16_Planar = (MV_VS_GVSP_PIX_COLOR | MV_VS_PIXEL_BIT_COUNT(48) | 0x0024)
MVVS_PixelType_Jpeg = (MV_VS_GVSP_PIX_CUSTOM | MV_VS_PIXEL_BIT_COUNT(24) | 0x0001)
class MV_VS_DATA(Structure):
_fields_ = [
@ -160,10 +173,21 @@ class PROCESS_MEMORY_COUNTERS(ctypes.Structure):
]
class MV_VS_JPG_PARAM(ctypes.Structure):
_fields_ = [
("pBufInput", ctypes.POINTER(ctypes.c_ubyte)),
("nBufInputLen", ctypes.c_uint),
("nWidth", ctypes.c_uint),
("nHeight", ctypes.c_uint),
("nJpgQuality", ctypes.c_uint),
("pBufOutput", ctypes.POINTER(ctypes.c_ubyte)),
("nBufOutputLen", ctypes.c_uint),
]
# PPROCESS_MEMORY_COUNTERS is simply a pointer to the struct
PPROCESS_MEMORY_COUNTERS = ctypes.POINTER(PROCESS_MEMORY_COUNTERS)
# Define function signatures
mv_lib.MV_VS_GetResultData.argtypes = [c_void_p, POINTER(MV_VS_DATA), c_int]
@ -192,98 +216,108 @@ mv_lib.MV_VS_StartRun.restype = c_int
def MV_VS_GetFrame(handle):
nRet = MV_VS_OK
stFrameData = MV_VS_DATA()
while True:
stFrameData = MV_VS_DATA()
nRet = mv_lib.MV_VS_GetResultData(handle, byref(stFrameData), 2000)
if nRet == MV_VS_OK:
# Print frame information
print(
f"Frame Width: [{stFrameData.nImageWidth}], Height: [{stFrameData.nImageHeight}], ImageLen: [{stFrameData.nImageLen}]")
nRet = mv_lib.MV_VS_GetResultData(handle, byref(stFrameData), 1000)
if nRet == MV_VS_OK:
# Print frame information
print(
f"Frame Width: [{stFrameData.nImageWidth}], Height: [{stFrameData.nImageHeight}], ImageLen: [{stFrameData.nImageLen}]")
# Process chunk data
currentDataTag = 0
while stFrameData.nChunkDataLen > currentDataTag:
chunkLength = ctypes.c_uint32()
chunkID = ctypes.c_uint32()
# Process chunk data
currentDataTag = 0
while stFrameData.nChunkDataLen > currentDataTag:
chunkLength = ctypes.c_uint32()
chunkID = ctypes.c_uint32()
# Calculate source addresses for chunkLength and chunkID
source_address_length = ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 4 - currentDataTag
source_address_id = ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - currentDataTag
# Copy data from source to chunkLength and chunkID
ctypes.memmove(ctypes.byref(chunkLength), source_address_length, 4)
ctypes.memmove(ctypes.byref(chunkID), source_address_id, 4)
# Convert network byte order to host byte order
chunkLength.value = socket.ntohl(chunkLength.value)
chunkID.value = socket.ntohl(chunkID.value)
# Print the values
print(f"chunkLength [{chunkLength.value}], chunkID: [{chunkID.value}]")
if chunkLength.value <= 0 or chunkLength.value > stFrameData.nChunkDataLen - 8 - currentDataTag:
break
if chunkID == CHUNK_RESULT_PORT: # Result data in JSON format
chResultInfo = ctypes.cast(
stFrameData.pChunkData + (stFrameData.nChunkDataLen - 8 - chunkLength - currentDataTag),
ctypes.POINTER(ctypes.c_char))
print(f"chResultInfo [{chResultInfo.value.decode()}] end")
elif chunkID == CHUNK_MASK_IMAGE_PORT: # Mask image data
maskModID = ctypes.c_uint32()
maskModFormat = ctypes.c_uint32()
maskModWidth = ctypes.c_uint32()
maskModHeight = ctypes.c_uint32()
# Calculate source addresses
# Calculate source addresses for chunkLength and chunkID
source_address_length = ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 4 - currentDataTag
source_address_id = ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - chunkLength.value - currentDataTag
source_address_format = source_address_id + 4
source_address_width = source_address_id + 8
source_address_height = source_address_id + 12
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - currentDataTag
# Copy data from source addresses to corresponding variables
ctypes.memmove(ctypes.byref(maskModID), source_address_id, 4)
ctypes.memmove(ctypes.byref(maskModFormat), source_address_format, 4)
ctypes.memmove(ctypes.byref(maskModWidth), source_address_width, 4)
ctypes.memmove(ctypes.byref(maskModHeight), source_address_height, 4)
# Copy data from source to chunkLength and chunkID
ctypes.memmove(ctypes.byref(chunkLength), source_address_length, 4)
ctypes.memmove(ctypes.byref(chunkID), source_address_id, 4)
print(
f"Mask ModID[{maskModID}], ModFormat[{maskModFormat}], ModWidth[{maskModWidth}], ModHeight[{maskModHeight}], ")
# Convert network byte order to host byte order
chunkLength.value = socket.ntohl(chunkLength.value)
chunkID.value = socket.ntohl(chunkID.value)
try:
chMaskModImageData = ctypes.cast(ctypes.create_string_buffer(chunkLength.value - 16 + 1),
ctypes.POINTER(ctypes.c_char))
if chMaskModImageData:
ctypes.memset(chMaskModImageData, 0, chunkLength.value - 16 + 1)
chImageData = ctypes.cast(ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - chunkLength.value - currentDataTag + 16,
ctypes.POINTER(ctypes.c_char))
ctypes.memmove(chMaskModImageData, chImageData, chunkLength.value - 16)
print(f"Mask data length [{chunkLength.value - 16}]")
# Print the values
print(f"chunkLength [{chunkLength.value}], chunkID: [{chunkID.value}]")
except (MemoryError, TypeError) as e:
print(f"Error allocating or copying memory: {e}")
if chunkLength.value <= 0 or chunkLength.value > stFrameData.nChunkDataLen - 8 - currentDataTag:
break
currentDataTag = currentDataTag + 8 + chunkLength.value
if chunkID.value == CHUNK_RESULT_PORT: # Result data in JSON format
chRawInfo = ctypes.cast(stFrameData.pChunkData, ctypes.POINTER(ctypes.c_char))
chRawInfo = ctypes.cast(ctypes.addressof(
chRawInfo.contents) + stFrameData.nChunkDataLen - 8 - chunkLength.value - currentDataTag,
ctypes.POINTER(ctypes.c_char))
chResultInfo = ctypes.string_at(chRawInfo, chunkLength.value)
chResultInfo = json.loads(chResultInfo.decode())
if chResultInfo:
print(f"chResultInfo OK")
elif chunkID.value == CHUNK_MASK_IMAGE_PORT: # Mask image data
maskModID = ctypes.c_uint32()
maskModFormat = ctypes.c_uint32()
maskModWidth = ctypes.c_uint32()
maskModHeight = ctypes.c_uint32()
# Calculate source addresses
source_address_id = ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - chunkLength.value - currentDataTag
source_address_format = source_address_id + 4
source_address_width = source_address_id + 8
source_address_height = source_address_id + 12
# Copy data from source addresses to corresponding variables
ctypes.memmove(ctypes.byref(maskModID), source_address_id, 4)
ctypes.memmove(ctypes.byref(maskModFormat), source_address_format, 4)
ctypes.memmove(ctypes.byref(maskModWidth), source_address_width, 4)
ctypes.memmove(ctypes.byref(maskModHeight), source_address_height, 4)
print(
f"Mask ModID[{maskModID.value}], ModFormat[{maskModFormat.value}], ModWidth[{maskModWidth.value}], ModHeight[{maskModHeight.value}], ")
try:
chMaskModImageData = ctypes.cast(ctypes.create_string_buffer(chunkLength.value - 16 + 1),
ctypes.POINTER(ctypes.c_char))
if chMaskModImageData:
ctypes.memset(chMaskModImageData, 0, chunkLength.value - 16 + 1)
chImageData = ctypes.cast(ctypes.addressof(
stFrameData.pChunkData.contents) + stFrameData.nChunkDataLen - 8 - chunkLength.value - currentDataTag + 16,
ctypes.POINTER(ctypes.c_char))
ctypes.memmove(chMaskModImageData, chImageData, chunkLength.value - 16)
print(f"Mask data length [{chunkLength.value - 16}]")
except (MemoryError, TypeError) as e:
print(f"Error allocating or copying memory: {e}")
currentDataTag = currentDataTag + 8 + chunkLength.value
# end process chunk data
m_stJpgParam = MV_VS_JPG_PARAM()
m_stJpgParam.pBufInput = ctypes.cast(stFrameData.pImage,ctypes.POINTER(ctypes.c_ubyte))
m_stJpgParam.nBufInputLen = stFrameData.nImageLen
jpegContents = ctypes.string_at(m_stJpgParam.pBufInput, m_stJpgParam.nBufInputLen)
with open("tmp/test.jpg", "wb") as f:
f.write(jpegContents)
# Release frame buffer
nRet = mv_lib.MV_VS_ReleaseResultData(handle, ctypes.byref(stFrameData))
if nRet != MV_VS_OK:
print(f"Release frame buffer fail! nRet [0x{nRet:x}]")
else:
print(f"Release frame buffer OK")
else:
print(f"Get frame buffer fail! nRet [0x{nRet:x}]")
# Release frame buffer
nRet = mv_lib.MV_VS_ReleaseResultData(handle, ctypes.byref(stFrameData))
if nRet != MV_VS_OK:
print(f"Release frame buffer fail! nRet [0x{nRet:x}]")
else:
print(f"MV_VS_GetResultData fail! nRet [0x{nRet&0xFFFFFFFF:x}]")
nRet = mv_lib.MV_VS_ReleaseResultData(handle, byref(stFrameData))
if nRet != MV_VS_OK:
print(f"Release frame buffer fail! nRet [0x{nRet&0xFFFFFFFF:x}]")
else:
print("Release frame buffer OK")
print(f"MV_VS_GetResultData fail! nRet [0x{nRet&0xFFFFFFFF:x}]")

View File

@ -49,30 +49,34 @@ def main():
pHandle1 = c_void_p()
pHandle2 = c_void_p()
nRet1 = mv_lib.MV_VS_CreateHandle(byref(pHandle1), MV_VS_DEVICE_INFO_1)
nRet2 = mv_lib.MV_VS_CreateHandle(byref(pHandle2), MV_VS_DEVICE_INFO_2)
nRet2=0
#nRet2 = mv_lib.MV_VS_CreateHandle(byref(pHandle2), MV_VS_DEVICE_INFO_2)
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"Create Handle failed! [{nRet1:#x} {nRet2:#x}]")
return
time.sleep(0.1)
nRet1 = mv_lib.MV_VS_Login(pHandle1, b"Admin", b"Abc1234")
nRet2 = mv_lib.MV_VS_Login(pHandle2, b"Admin", b"Abc1234")
time.sleep(0.1)
#nRet2 = mv_lib.MV_VS_Login(pHandle2, b"Admin", b"Abc1234")
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"Login failed! [{nRet1:#x} {nRet2:#x}]")
print(f"Login failed! [{nRet1&0xFFFFFFFF:#x} {nRet2&0xFFFFFFFF:#x}]")
return
else:
print("Login OK")
nRet1 = mv_lib.MV_VS_SetBoolValue(pHandle1, b"CommandImageMode", 0)
nRet2 = mv_lib.MV_VS_SetBoolValue(pHandle2, b"CommandImageMode", 0)
#nRet2 = mv_lib.MV_VS_SetBoolValue(pHandle2, b"CommandImageMode", 0)
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"CommandImageMode failed! [{nRet1 & 0xFFFFFFFF:#x} {nRet2 & 0xFFFFFFFF:#x}]")
print(f"CommandImageMode failed! [{nRet1&0xFFFFFFFF:#x} {nRet2&0xFFFFFFFF:#x}]")
return
else:
print("CommandImageMode OK")
nRet1 = mv_lib.MV_VS_SetEnumValue(pHandle1, b"AcquisitionMode", 0)
nRet2 = mv_lib.MV_VS_SetEnumValue(pHandle2, b"AcquisitionMode", 0)
#nRet2 = mv_lib.MV_VS_SetEnumValue(pHandle2, b"AcquisitionMode", 0)
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"AcquisitionMode failed! [{nRet1 & 0xFFFFFFFF:#x} {nRet2 & 0xFFFFFFFF:#x}]")
print(f"AcquisitionMode failed! [{nRet1&0xFFFFFFFF:#x} {nRet2&0xFFFFFFFF:#x}]")
return
else:
print("AcquisitionMode OK")
@ -93,22 +97,32 @@ def main():
# Create the thread
thread = threading.Thread(target=MV_VS_GetFrame, args=(pHandle1,))
thread2 = threading.Thread(target=MV_VS_GetFrame, args=(pHandle2,))
# Start the thread
thread.start()
#thread2.start()
#Start the camera test
nRet1 = mv_lib.MV_VS_StartRun(pHandle1)
#nRet2 = mv_lib.MV_VS_StartRun(pHandle2)
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"Start run failed! [{nRet1 & 0xFFFFFFFF:#x} {nRet2 & 0xFFFFFFFF:#x}]")
while True:
print("main loop cycle")
nRet1 = mv_lib.MV_VS_StartRun(pHandle1)
nRet2 = mv_lib.MV_VS_StartRun(pHandle2)
#Trigger acquisition & test execution
nRet1 = mv_lib.MV_VS_SetCommandValue(pHandle1, "AcquisitionStart")
#nRet2 = mv_lib.MV_VS_SetCommandValue(pHandle2, "AcquisitionStart")
if nRet1 != MV_VS_OK or nRet2 != MV_VS_OK:
print(f"Start run failed! [{nRet1 & 0xFFFFFFFF:#x} {nRet2 & 0xFFFFFFFF:#x}]")
return
print(f"AcquisitionStart failed! [{nRet1 & 0xFFFFFFFF:#x} {nRet2 & 0xFFFFFFFF:#x}]")
else:
print("Start run OK")
print("AcquisitionStart OK")
time.sleep(1)
return 0
if __name__ == "__main__":
main()