halcon的向量变量 Vector


在HDevelop中,除了tuples和iconic objects这两种变量类型之外,还有第三种变量类型:vector。

注:iconic objects数据类型即图标对象,指的是 图像、区域和XLD数据的总称


向量是可以容纳任意数量元素的容器,所有元素都必须具有完全相同的变量类型(即元组、图标对象或向量)。

HDevelop中的向量与C++标准模板库中的向量相同。


演示代码:

dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
Message := 'This program gives an overview of'
Message[1] := 'vector variables and how to use them.'
Message[2] := 'Please'
Message[3] := ' - step through the program,'
Message[4] := ' - read the comments,'
Message[5] := ' - and check the variable view.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
stop ()
* 
*向量构造:
*写向量最简单的方法是放一个(逗号分隔)
*在花括号之间的元素列表。
Vector1 := {1,2}
* *注意,{[1,2]}与{1,2}不同:
Vector2 := {[1,2]}

*向量元素可以是常量(表达式)也可以是变量。
Tuple1 := [5,6]
Tuple2 := 'eight'
Vector3 := {Tuple1,Tuple2}

* 向量也可以包含图标对象:
read_image (ImageFabrik, 'fabrik')
read_image (ImagePatras, 'patras')
ImageVector := {ImageFabrik,ImagePatras}

*可以使用多维向量:
Vector2dim := {{1,2},Vector3}
Vector3dim := {Vector2dim,{Vector1,Vector2}}
*注意,向量的所有元素必须具有相同的类型。
* 下面是错误的示例
* InvalidExpression := {Vector1,Vector2dim}
* 

* 向量元素读写:
*向量元素读写使用.at() 表达式
Tuple := Vector3.at(0)
Image := ImageVector.at(1)
* .at() expressions may as well serve as l-values.
* E.g., they can be used as output parameters.
Vector4.at(0) := Tuple
*允许写入不存在的向量元素。如有必要,
*向量将自动填充空元素。
Vector5.at(4) := Tuple

* 向量元素可以用作运算符或过程的参数
for I := 0 to ImageVector.length() - 1 by 1
    sobel_amp (ImageVector.at(I), ImageVectorSobel.at(I), 'sum_abs', 3)
endfor

*还可以组合多个.at()表达式来访问
*多维向量的子元素。
Vector3dim.at(1).at(0) := {5,6}
* 即使是以下情况也是可能的(尽管不完全推荐)
Vector3dim.at(0).at(1).at(1)[0] := 8
* 
* 取向量长度:
Length := Vector1.length()
* 

* 移除向量全部元素
Vector3dimCopy := Vector3dim
Vector3dimCopy.clear()

*注意,清除的向量仍然保持其变量类型。这个
*下列赋值导致类型冲突,因此无效!
* Vector3dimCopy.at(0) := 1
* Vector3dimCopy.at(0) := {1}
* .remove() removes an element with given index from a vector.
Vector5.remove(0)
* 
* .insert() inserts at the given position one vector element into a vector.
Vector5.insert(1,2)
* Again, the vector gets filled up with empty elements where necessary.
Vector5.insert(8,10)
* 

* 向量转换:
* 转换tuple为一维向量
Tuple3 := [1,2,3,4,5,6,7,8]
convert_tuple_to_vector_1d (Tuple3, 1, Vector1FromTuple3)
convert_tuple_to_vector_1d (Tuple3, 2, Vector2FromTuple3)

* 任意维的输入向量,并将其存储在单个输出元组中
convert_vector_to_tuple (Vector5, TupleFromVector5)
convert_vector_to_tuple (Vector2dim, TupleFromVector2dim)
* 
*算子dev_inspect_ctrl弹出一个变量视图可用于检查向量变量
dev_inspect_ctrl ([Tuple3,Vector1FromTuple3,Vector2FromTuple3,Vector5,TupleFromVector5,Vector2dim,TupleFromVector2dim,Vector3dim])


那么, halcon中这个向量跟数学中的平面向量有什么关系?

如下图,勇哥按数学上的定义计算一下向量p3:

向量p1=(35-0,35-0)=p1(35,35)

向量p2=(80-0,15-0)=p2(80,15)

向量p3=向量p1+向量p2=p2(35+80,35+15)=p2(115,50)

image.png

用halcon试试,可以看到是不允许两个向量相加的。

image.png

勇哥也查了一下C++的标准模板库中的向量,一般认为可以理解为它是数组的加强版,即是一种自动分配内存的容器。

有人说,C++中的向量叫vector这个名字,主要是因为当年标准委员会智障。

实际上并不支持向量的加减乘除运算,所以跟数学上的平面向量毛的关系都没有。


也许halcon就是照着C++的vector照搬的吧。



在勇哥的netMarketing类库中有向量类Vecter。

        private void button13_Click_1(object sender, EventArgs e)
        {
            Vecter p1 = new Vecter(2);
            p1.ele[0] = 35; p1.ele[1] = 35;
            Vecter p2 = new Vecter(2);
            p2.ele[0] = 80; p2.ele[1] = 15;
            var p3 = p1 + p2;

        }

可以看到,运算的结果是正确的。

image.png


我们知道矩阵也可以看成一组向量的集合,因此向量运算是矩阵运算的基础,也是非常常用的。


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864