三軸手機測試系統包含幾個重點項目
1. android系統程式的撰寫2. 三軸馬達的控制
3. CDD 影像擷取
4. 上位機程式撰寫
首先 系統硬體包含三軸馬達, CCD
利用BCB所寫的測試GUI去控制AP(Audio Precision)做聲音的量測
接續c# Emgu WebCAM 影像應用(一)-影像物體顏色追蹤這篇文章配合旋轉台,將ROI中的影像顏色的標的物角度旋轉到90度的正向位置.
旋轉台是用RS232控制的架構
_Port[PortID] = new SerialPort(PortNumber, BaudRate, Parity.None, 8, StopBits.One);
MCvBox2D rect;
rect = currentContour.GetMinAreaRect();
這個函式GetMinAreaRect會包含角度的值 rect.angle
再依據angle的值去控制轉台旋轉到此角度達到所要需求.
編寫環境:
OS: Win 11
C#: VS2010
EMGU:2.4.10
構想: 利用滑鼠down->move->up在圖形上的事件, 抓取ROI區塊上的顏色, 進而去判斷整個影像中相對應的顏色物件並將其以最小矩形框出.
利用滑鼠的事件
private void imageBox1_MouseDown(object sender, MouseEventArgs e)
private void imageBox1_MouseMove(object sender, MouseEventArgs e)
private void imageBox1_MouseUp(object sender, MouseEventArgs e)
去抓取imageBox1中的ROI區塊的影像去做處理
利用到的函式
// bgr 轉 hsv
TEmgu._EmguPara.TouchRegionHsv = CommonData.ROIImageSource.Convert<Hsv, Byte>();
TEmgu._EmguPara.TouchRegionHsv.SmoothGaussian(5);
TEmgu._EmguPara.m_Lower = new Hsv(TEmgu._EmguPara.m_TargetColor.Hue - 30, TEmgu._EmguPara.m_TargetColor.Satuation - 30, TEmgu._EmguPara.m_TargetColor.Value - 30);
TEmgu._EmguPara.m_Higher = new Hsv(TEmgu._EmguPara.m_TargetColor.Hue + 30, TEmgu._EmguPara.m_TargetColor.Satuation + 30, TEmgu._EmguPara.m_TargetColor.Value + 30);
//搜尋的顏色範圍
TEmgu._EmguPara.InRageFrame = TEmgu._EmguPara.ImageHsv.InRange(TEmgu._EmguPara.m_Lower, TEmgu._EmguPara.m_Higher);
//抓取ROI顏色的最小矩形
using (MemStorage storage = new MemStorage())
{
for (Contour<Point> contours = TEmgu._EmguPara.InRageFrame.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, storage); contours != null; contours = contours.HNext)
{
Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.010, storage);
if (currentContour.BoundingRectangle.Width < 10 || currentContour.BoundingRectangle.Height < 10) //对于太小的外接矩形,删除掉
{
continue;
}
if (currentContour.BoundingRectangle.Width > 50 && currentContour.BoundingRectangle.Height > 50)
{
TEmgu._EmguPara.ImageSource.Draw(currentContour.GetMinAreaRect(), new Bgr(0, 0, 255), 1);
MCvBox2D rect;
rect = currentContour.GetMinAreaRect();
CommonData.Angle = rect.angle;
cnti++;
}
}
}