1

Halcon Progress 20 为不同的协议(HALCON、UDP、TCP)提供了套接字,并提供了使用通用套接字通信发送任意数据的send_data(Socket, Format, Data, To)过程。如何使用此过程将图像从 hdevelop 发送到另一个连接的套接字?

Halcon 程序化可视化解决方案指南指出以下内容:

有时可能不需要应用标准的 HALCON 可视化运算符,而是使用自编程版本。这可以通过使用为所有数据类型提供的访问函数来实现。这些示例是get_image_pointer1get_region_runsget_contour_xld。像这样的运算符允许完全访问所有内部数据类型。此外,它们以各种形式(例如,游程编码、点或轮廓)提供数据,以使进一步的处理更容易。基于这些数据,可以轻松开发自编程的可视化。

这是我认为应该如何工作的一个基本示例:

read_image (Image, 'printer_chip/printer_chip_01')

* Send image via socket
Protocol := 'TCP4'
Timeout := 5.0
* Open a socket connection
open_socket_connect ('127.0.0.1', 5000, ['protocol','timeout'], [Protocol,Timeout], Socket)
* To is only used with protocol HALCON or UDP (empty for bound TCP connections)
To := []
* The following send_data is working, the connected socket receives this message
send_data (Socket, 'z', ['Generic sockets are great!'], To)

* Make sure we have only one channel
rgb1_to_gray (Image, GrayImage)
get_image_pointer1 (GrayImage, Pointer, Type, Width, Height)

* get_image_pointer returns pointer of type 'byte' -> use a byte format specifier for socket
* c: one byte = 8 bit, signed
* Append the type specifier with a number for a repeat count, e.g. 'c5' means 'ccccc'
Format := 'c' + Width*Height
* Format := 'c'
* How to cast the raw pointer correctly to send the data it points to?
send_data (Socket, Format, [Pointer], [])

最后一行send_data (Socket, Format, [Pointer], [])抛出异常:

未处理的程序异常:

在过程“主”行中调用“send_data”时 HALCON 操作员错误:78。

格式规范与数据不匹配(HALCON 错误代码:5628)

显然,这Pointer是指向图像在内存中的位置的地址,而不是可能导致错误的实际数据。

有没有办法在 HDevelop 中正确转换原始指针以通过套接字发送它?或者这只能在使用 Halcon 库的外部 C/C++/C# 应用程序中完成?

Halcon文档gen_image_pointer1仅提供此 C 示例:

Hobject  Image;
char     typ[128];
Hlong     width,height;
unsigned char *ptr;

read_image(&Image,"fabrik");
get_image_pointer1(Image,(Hlong*)&ptr,typ,&width,&height);

我想使用 HDevelop 的功能,而不是使用 C/C++/C# 中的套接字(尽管这是另一种方式)。唯一缺少的是将图像从 HDevelp 中实际发送到接收套接字。

4

1 回答 1

1

这里的代码我希望可以帮助你。它序列化数据并发送它们。

* Send image via socket
Protocol := 'TCP4'
Timeout := 5.0
* Open a socket connection
open_socket_connect ('127.0.0.1', 5000, ['protocol','timeout'], [Protocol,Timeout], Socket)
get_socket_param (Socket, 'address_info', Address)
* 
* To is not evaluated for TCP and connected UDP sockets
To := []

* Make sure we have only one channel
rgb1_to_gray (Image, GrayImage)
get_image_pointer1 (GrayImage, _, _, Width, Height)    

RowIndexes := []
for j:=0 to Height-1 by 1
    tuple_gen_const (Width, j, TempIndexes)
    RowIndexes := [RowIndexes,TempIndexes]
endfor

ColIndexes := []
tuple_gen_sequence (0, Width-1, 1, Sequence)
for i:=0 to Height-1 by 1
    ColIndexes := [ColIndexes,Sequence]
endfor

* get pixel values
get_grayval (GrayImage, RowIndexes, ColIndexes, Data)

* C: one byte = 8 bit, Unsigned
Format := 'C' + Width*Height

send_data (Socket, Format, Data, To)

[编辑2]

可以使用以下代码优化生成 RowIndexes 和 ColIndexes 的代码部分:

tuple_gen_const (Width*Height, 0, RowIndexes)
tuple_gen_const (Width, 0, Const)
tuple_gen_sequence (0, Width-1, 1, Sequence)
for j:=1 to Height-1 by 1    
    IndexSequence:= Sequence+j*Width    
    RowIndexes[IndexSequence] := Const+j
endfor    

tuple_gen_const (Width*Height, 0, ColIndexes)
for i:=0 to Height-1 by 1
    IndexSequence:= Sequence+i*Width 
    ColIndexes[IndexSequence] := Sequence
endfor
于 2020-11-18T20:53:09.363 回答