孫凱明,郝 明,王 剛
(黑龍江省科學(xué)院智能制造研究所,哈爾濱 150090)
中藥丸的分揀包裝主要采用常工計數(shù)法[1]、機(jī)械計數(shù)法[2]、光電數(shù)粒機(jī)[3]等,這些方法計數(shù)速度慢,設(shè)備占地面積大,只能針對特定規(guī)格的中藥丸進(jìn)行計數(shù)分裝。隨著視覺檢測技術(shù)的發(fā)展,視覺數(shù)粒技術(shù)在藥片包裝中的應(yīng)用得到廣泛研究。姚瑩[4]等研制了一種平板式數(shù)粒機(jī),通過機(jī)器視覺系統(tǒng)及藥粒位置分析實現(xiàn)藥粒的快速準(zhǔn)確計數(shù)。DATA公司研制了ICU系列—基于機(jī)器視覺的高速藥粒數(shù)粒裝瓶機(jī),其結(jié)構(gòu)緊湊,計數(shù)準(zhǔn)確。但機(jī)器視覺計數(shù)容易受到外界條件的干擾,在我國藥廠難以普及,故研究基于機(jī)器視覺且計數(shù)精準(zhǔn)的高速藥粒計數(shù)系統(tǒng)具有廣闊的市場前景。針對基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)方案,結(jié)合Dalsa線陣相機(jī)SDK、Opencv 4.55及Visual Studio 2019,設(shè)計了基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)程序。
基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)由線陣相機(jī)、振動盤、光源及PLC控制器組成(如圖1所示)。藥粒高速下落時可能發(fā)生碰撞等情況,軌跡變得不規(guī)則,通過線陣相機(jī)成像后,顆粒間的位置關(guān)系不再發(fā)生改變,可利用藥粒間的位置關(guān)系信息去除重復(fù)計數(shù)的藥粒,實現(xiàn)精準(zhǔn)計數(shù)。本系統(tǒng)選擇DALSA的LA-GM-04K08A-00-R型號線陣相機(jī),為減小運動模糊,攝像機(jī)的曝光時間很短,需要使用高強度的光源才能產(chǎn)生足夠的光通量,故采用面光源背向照明的方式,以突出其輪廓特征。
圖1 基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)Fig.1 High-speed on-line drug counting system based on machine vision
圖像采集事件處理類用于顯示采集的圖像,在顯示圖像的過程中需要將原始數(shù)據(jù)的BayerRG8圖像轉(zhuǎn)化為cv::Mat類型,以便通過OpenCV顯示。
class CSampleCaptureEventHandler :public ICaptureEventHandler
{
{
cv::Mat img(objImageDataPointer->GetHeight(),
objImageDataPointer->GetWidth(), CV_8UC3);
img.create(objImageDataPointer->GetHeight(),
objImageDataPointer->GetWidth(), CV_8UC3);
//假設(shè)原始數(shù)據(jù)是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);
}
};
線陣相機(jī)初始化包括SDK初始化、采集設(shè)備設(shè)置、數(shù)據(jù)緩存申請及傳輸?shù)攘鞒獭?/p>
IGXFactory::GetInstance().Init();//SDK初始化
m_pSampleCaptureEventHandle = new CSampleCaptureEventHandler();
//采集設(shè)備設(shè)置
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);
//數(shù)據(jù)傳輸及回調(diào)函數(shù)
m_Xfer = new SapAcqDeviceToBuf(m_AcqDevice, m_Buffers, XferCallback, this);
m_Xfer->GetPair(0)->SetFramesPerCallback(m_nFramesPerCallback);
nFramesPerCallback = m_Xfer->GetPair(0)->GetFramesPerCallback();
開始采集時調(diào)用m_Xfer->Grab(),結(jié)束采集時調(diào)用m_Xfer->Freeze()。
在基于MFC對話框的程序中將OpenCV的顯示窗口附著在MFC的CPictureCtrl控件上,聲明OpenCV窗口Imager1,根據(jù)CPictureCtrl控件大小調(diào)整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)。
設(shè)計的藥粒計數(shù)程序流程如圖2所示,在圖像預(yù)處理的基礎(chǔ)上采用輪廓提取,根據(jù)輪廓面積進(jìn)行篩選,濾除噪聲干擾。判斷其是否是“8”字型粘連[5-6],如果是則采用距離變換的方法進(jìn)一步識別,若確認(rèn)是“8”字型粘連則計數(shù)加1。在前后兩幀圖像中,處于圖像邊緣的藥粒圖像可能因顯示不全而造成重復(fù)計數(shù),利用線陣相機(jī)成像后相對位置不發(fā)生改變的特點,對橫坐標(biāo)相等且在前后兩幀的上下邊緣處,根據(jù)公式剔除。
圖2 “8”字型粘連分割Fig.2 “8” type adhesive segmentation
圖3 相鄰兩幀圖像中藥粒重復(fù)計數(shù)剔除Fig.3 Repeated counting of eliminated Chinese medicine granules in adjacent frames
圖4 藥粒計數(shù)處理程序流程Fig.4 Flow of drug counting processing program
其中,Cs1與Cs2表示區(qū)域S1和S2的圓度,Cs1+s2表示區(qū)域S1與S2拼接后形成的區(qū)域的圓度,xs1與xs2表示區(qū)域S1與S2的中心水平位置,T1、T2及T3為閾值。區(qū)域的圓度與中心可以通過邊緣提取及外接矩形獲得。
實物系統(tǒng)如圖5所示,配置如表1所示。
表1 基于機(jī)器視覺的高速藥粒分裝裝置實驗設(shè)置Tab.1 Experimental setting of high speed drug dispensing device based on machine vision
圖5 實驗系統(tǒng)實物Fig.5 Experimental system object
系統(tǒng)界面及運行結(jié)果如圖6所示,程序中設(shè)置了計數(shù)目標(biāo),模擬裝瓶過程。圖中紅色矩形為識別出的“8”字型粘連,綠色與藍(lán)色矩形為前后兩幀重復(fù)計數(shù)剔除。
圖6 基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)程序界面及計數(shù)結(jié)果Fig.6 Program interface and counting result of high speed on-line drug count system based on machine vision
從表2可以看出,系統(tǒng)計數(shù)精度達(dá)100%,可實現(xiàn)精準(zhǔn)計數(shù)。
表2 計數(shù)實驗結(jié)果Tab.2 Results of counting experiment
為實現(xiàn)中藥藥粒的高速計數(shù),結(jié)合Dalsa線陣相機(jī)SDK、Opencv 4.55及Visual Studio 2019,設(shè)計了基于機(jī)器視覺的高速在線藥粒計數(shù)系統(tǒng)程序。從計數(shù)實驗結(jié)果來看,此系統(tǒng)計數(shù)精度達(dá)100%,可滿足藥廠對藥粒分裝的精度要求,具有十分廣闊的市場前景。