今天测量一个摄像头的宽度:
测量的原理是:
- 计算一条直线上的灰度值,做成一条曲线,
- 对这个曲线的每一点都计算该点的导数得到一条新的曲线,导数大的地方也就是变化大的位置也就是边缘,然后根据边缘的像素点的位置计算像素点的个数,
- 然后结合标定的数据得到实际的尺寸。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
dev_update_window ('on') dev_close_window () dev_open_window (0, 0, 728, 512, 'black', WindowID) set_display_font (WindowID, 40, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (3) * Image Acquisition 01: Code generated by Image Acquisition 01 open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', '[1] PC Camera', 0, -1, AcqHandle) grab_image_start (AcqHandle, -1) while (true) grab_image_async (Fuse, AcqHandle, -1) * Measure 02: Code generated by Measure 02 * Measure 02: Prepare measurement AmplitudeThreshold := 23 RoiWidthLen2 := 56.5 set_system ('int_zooming', 'true') * Measure 02: Coordinates for line Measure 02 [0] LineRowStart_Measure_02_0 := 60.1502 LineColumnStart_Measure_02_0 := 1491.94 LineRowEnd_Measure_02_0 := 1895.62 LineColumnEnd_Measure_02_0 := 1513.04 * Measure 02: Convert coordinates to rectangle2 type TmpCtrl_Row := 0.5*(LineRowStart_Measure_02_0+LineRowEnd_Measure_02_0) TmpCtrl_Column := 0.5*(LineColumnStart_Measure_02_0+LineColumnEnd_Measure_02_0) TmpCtrl_Dr := LineRowStart_Measure_02_0-LineRowEnd_Measure_02_0 TmpCtrl_Dc := LineColumnEnd_Measure_02_0-LineColumnStart_Measure_02_0 TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc) TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc) TmpCtrl_Len2 := RoiWidthLen2 * Measure 02: Create measure for line Measure 02 [0] gen_rectangle2 (ROI, TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2) dev_set_color ('green') dev_display (ROI) * Measure 02: Attention: This assumes all images have the same size! gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 2592, 1944, 'nearest_neighbor', MsrHandle_Measure_02_0) * Measure 02: *************************************************************** * Measure 02: * The code which follows is to be executed once / measurement * * Measure 02: *************************************************************** * Measure 02: The image is assumed to be made available in the * Measure 02: variable last displayed in the graphics window copy_obj (Fuse, Image, 1, 1) * Measure 02: Execute measurements measure_pairs (Image, MsrHandle_Measure_02_0, 6.4, 23, 'all', 'all', Row1_Measure_02_0, Column1_Measure_02_0, Amplitude1_Measure_02_0, Row2_Measure_02_0, Column2_Measure_02_0, Amplitude2_Measure_02_0, Width_Measure_02_0, Distance_Measure_02_0) * Measure 02: Do something with the results try disp_line(WindowID, Row1_Measure_02_0, Column1_Measure_02_0, Row2_Measure_02_0, Column2_Measure_02_0) catch (Exception) if (Exception[0] == 5200) dev_get_exception_data (Exception, 'error_message', ErrMsg) set_tposition (3600, 24, 12) write_string (3600, ErrMsg) return () else * rethrow the exception * throw ([Exception,'unknown exception in myproc']) endif endtry for i := 0 to |Row1_Measure_02_0| - 1 by 1 gen_contour_polygon_xld (EdgeFirst, [-sin(TmpCtrl_Phi + rad(90)) * TmpCtrl_Len2 + Row1_Measure_02_0[i],-sin(TmpCtrl_Phi - rad(90)) * TmpCtrl_Len2 + Row1_Measure_02_0[i]], [cos(TmpCtrl_Phi + rad(90)) * TmpCtrl_Len2 + Column1_Measure_02_0[i],cos(TmpCtrl_Phi - rad(90)) * TmpCtrl_Len2 + Column1_Measure_02_0[i]]) gen_contour_polygon_xld (EdgeSecond, [-sin(TmpCtrl_Phi + rad(90)) * TmpCtrl_Len2 + Row1_Measure_02_0[i],-sin(TmpCtrl_Phi - rad(90)) * TmpCtrl_Len2 + Row1_Measure_02_0[i]], [cos(TmpCtrl_Phi + rad(90)) * TmpCtrl_Len2 + Column1_Measure_02_0[i],cos(TmpCtrl_Phi - rad(90)) * TmpCtrl_Len2 + Column1_Measure_02_0[i]]) dev_set_color ('cyan') dev_display (EdgeFirst) dev_set_color ('red') dev_display (EdgeSecond) dev_set_color ('red') if (i == 0) set_tposition (WindowID, Row1_Measure_02_0[i] + 5, Row1_Measure_02_0[i] + 20) else set_tposition (WindowID, Row1_Measure_02_0[i] - 40, Row1_Measure_02_0[i] + 20) endif write_string (WindowID, 'width: ' + Width_Measure_02_0[i]/17.8 + ' mm') endfor * Measure 02: Clear measure when done close_measure (MsrHandle_Measure_02_0) endwhile close_framegrabber (AcqHandle) |