gen_empty_obj 算子解釋: Create an empty object tuple。
其算子簽名為:
gen_empty_obj( : EmptyObject : : )
那么有人要問:創建一個空的object有什么用呢?
其實gen_empty_obj 的作用類似於面向對象編程中的“類的實例化”,可以防止“空引用異常”。
語句gen_empty_obj( EmptyObject )的意思是:EmptyObject 是真實存在的一個object(因為它被創建出來了),只是這個object的內容為空而已。有點類似集合論中的:{∅} != ∅
舉個例子說明。
main函數如下:

get_rectangle (Image, rectangle)函數內容如下:
1 * gen_empty_obj (rectangle) 2 threshold (Image, Region, 128, 255) 3 fill_up (Region, RegionFillUp) 4 connection (RegionFillUp, ConnectedRegions) 5 select_shape (ConnectedRegions, ConnectedRegions, 'area', 'and', 4000, 9999999) 6 count_obj (ConnectedRegions, Number) 7 8 if (Number > 5) 9 select_shape (ConnectedRegions, rectangle, 'rectangularity', 'and', 0.99, 1) 10 endif 11 12 return ()
按F5執行,報錯如下:

為什么會這樣呢?

函數中Number的值為3,因此進不了if(Number > 5)語句內部,所以rectangle變量就沒有生成,也就是說rectangle變量根本沒有出現過。
本來rectangle變量沒出現過並不是什么問題,但是你在main函數中用count_obj (rectangle, Number)強行取rectangle的個數那就是問題了——你怎么能取一個從來不存在的對象(object)的個數呢?
如果要解決這種異常,只需要將函數中被注釋的第一行代碼取消注釋即可。這樣rectangle就被實例化了:

這樣執行count_obj (rectangle, Number)也就不會報錯了,它得到的rectangle的個數為0。
