孫凱明,郝 明,王 剛
(黑龍江省科學院智能制造研究所,哈爾濱 150090)
中藥丸的分揀包裝主要采用常工計數法[1]、機械計數法[2]、光電數粒機[3]等,這些方法計數速度慢,設備占地面積大,只能針對特定規格的中藥丸進行計數分裝。隨著視覺檢測技術的發展,視覺數粒技術在藥片包裝中的應用得到廣泛研究。姚瑩[4]等研制了一種平板式數粒機,通過機器視覺系統及藥粒位置分析實現藥粒的快速準確計數。DATA公司研制了ICU系列—基于機器視覺的高速藥粒數粒裝瓶機,其結構緊湊,計數準確。但機器視覺計數容易受到外界條件的干擾,在我國藥廠難以普及,故研究基于機器視覺且計數精準的高速藥粒計數系統具有廣闊的市場前景。針對基于機器視覺的高速在線藥粒計數系統方案,結合Dalsa線陣相機SDK、Opencv 4.55及Visual Studio 2019,設計了基于機器視覺的高速在線藥粒計數系統程序。
基于機器視覺的高速在線藥粒計數系統由線陣相機、振動盤、光源及PLC控制器組成(如圖1所示)。藥粒高速下落時可能發生碰撞等情況,軌跡變得不規則,通過線陣相機成像后,顆粒間的位置關系不再發生改變,可利用藥粒間的位置關系信息去除重復計數的藥粒,實現精準計數。本系統選擇DALSA的LA-GM-04K08A-00-R型號線陣相機,為減小運動模糊,攝像機的曝光時間很短,需要使用高強度的光源才能產生足夠的光通量,故采用面光源背向照明的方式,以突出其輪廓特征。

圖1 基于機器視覺的高速在線藥粒計數系統Fig.1 High-speed on-line drug counting system based on machine vision
圖像采集事件處理類用于顯示采集的圖像,在顯示圖像的過程中需要將原始數據的BayerRG8圖像轉化為cv::Mat類型,以便通過OpenCV顯示。
class CSampleCaptureEventHandler :public ICaptureEventHandler
{
{
cv::Mat img(objImageDataPointer->GetHeight(),
objImageDataPointer->GetWidth(), CV_8UC3);
img.create(objImageDataPointer->GetHeight(),
objImageDataPointer->GetWidth(), CV_8UC3);
//假設原始數據是BayerRG8圖像
void* pRGB24Buffer = objImageDataPointer->ConvertToRGB24(GX_BIT_0_7,GX_RAW2RGB_NEIGHBOUR, true);
memcpy(img.data, pRGB24Buffer, (objImageDataPointer->GetHeight()) * (objImageDataPointer->GetWidth()) * 3);
//顯示圖像
cv::imshow(“Imager1”, img);
cv::waitKey(1);
}
};
線陣相機初始化包括SDK初始化、采集設備設置、數據緩存申請及傳輸等流程。
IGXFactory::GetInstance().Init();//SDK初始化
m_pSampleCaptureEventHandle = new CSampleCaptureEventHandler();
//采集設備設置
m_AcqDevice = new SapAcqDevice(SapLocation(CStringA(“Linea_M4096-7um_1”), 0), NULL);
m_AcqDevice->SetConfigFile(“D:\Program Files (x86)\CamFiles\User\T_Linea_M4096-7um_Default_Default.ccf”);
//緩存申請
m_Buffers = new SapBufferWithTrash(MAX_BUFFER, m_AcqDevice);
//數據傳輸及回調函數
m_Xfer = new SapAcqDeviceToBuf(m_AcqDevice, m_Buffers, XferCallback, this);
m_Xfer->GetPair(0)->SetFramesPerCallback(m_nFramesPerCallback);
nFramesPerCallback = m_Xfer->GetPair(0)->GetFramesPerCallback();
開始采集時調用m_Xfer->Grab(),結束采集時調用m_Xfer->Freeze()。
在基于MFC對話框的程序中將OpenCV的顯示窗口附著在MFC的CPictureCtrl控件上,聲明OpenCV窗口Imager1,根據CPictureCtrl控件大小調整OpenCV窗口Imager1的大小,并將其句柄附著在CPictureCtrl控件上。
cv::namedWindow(“Imager1”, cv::WINDOW_NORMAL);
CRect rect;
GetDlgItem(IDC_PIC)->GetWindowRect(rect);
cv::resizeWindow(“Imager1”, rect.Width(), rect.Height());
HWND hWnd = (HWND)cvGetWindowHandle(“Imager1”);
m_hOpenCVWnd = hWnd;
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_PIC)->m_hWnd);
::ShowWindow(hParent, SW_HIDE)。
設計的藥粒計數程序流程如圖2所示,在圖像預處理的基礎上采用輪廓提取,根據輪廓面積進行篩選,濾除噪聲干擾。判斷其是否是“8”字型粘連[5-6],如果是則采用距離變換的方法進一步識別,若確認是“8”字型粘連則計數加1。在前后兩幀圖像中,處于圖像邊緣的藥粒圖像可能因顯示不全而造成重復計數,利用線陣相機成像后相對位置不發生改變的特點,對橫坐標相等且在前后兩幀的上下邊緣處,根據公式剔除。

圖2 “8”字型粘連分割Fig.2 “8” type adhesive segmentation

圖3 相鄰兩幀圖像中藥粒重復計數剔除Fig.3 Repeated counting of eliminated Chinese medicine granules in adjacent frames

圖4 藥粒計數處理程序流程Fig.4 Flow of drug counting processing program
其中,Cs1與Cs2表示區域S1和S2的圓度,Cs1+s2表示區域S1與S2拼接后形成的區域的圓度,xs1與xs2表示區域S1與S2的中心水平位置,T1、T2及T3為閾值。區域的圓度與中心可以通過邊緣提取及外接矩形獲得。
實物系統如圖5所示,配置如表1所示。

表1 基于機器視覺的高速藥粒分裝裝置實驗設置Tab.1 Experimental setting of high speed drug dispensing device based on machine vision

圖5 實驗系統實物Fig.5 Experimental system object
系統界面及運行結果如圖6所示,程序中設置了計數目標,模擬裝瓶過程。圖中紅色矩形為識別出的“8”字型粘連,綠色與藍色矩形為前后兩幀重復計數剔除。

圖6 基于機器視覺的高速在線藥粒計數系統程序界面及計數結果Fig.6 Program interface and counting result of high speed on-line drug count system based on machine vision
從表2可以看出,系統計數精度達100%,可實現精準計數。

表2 計數實驗結果Tab.2 Results of counting experiment
為實現中藥藥粒的高速計數,結合Dalsa線陣相機SDK、Opencv 4.55及Visual Studio 2019,設計了基于機器視覺的高速在線藥粒計數系統程序。從計數實驗結果來看,此系統計數精度達100%,可滿足藥廠對藥粒分裝的精度要求,具有十分廣闊的市場前景。