Emgu CV 2.4.2を使用していて、次のアルゴリズムを実行したいと思います。
- ブロブを取得する
- 計算を高速化するためにROIを設定する
- ブロブから極小値のピクセル位置を取得します
- ブロブを分割する
- 境界の長方形を分割されたブロブに描画します
手順1-2を実行し、BGStatModelを使用してblobを抽出しました。これは私が得た結果です:
垂直投影で極小値のピクセル位置を取得したい。それを取得した後、私はブロブを分割し、次のように長方形を描きたいです:
ブロブ領域のすべてのピクセルをチェックして極小値のピクセル位置を取得しようとしましたが、アプリケーションの実行が非常に遅くなります。これが私のコードです:
Point minPix = new Point(0,0);
//copy the foreground frame
Image<Gray, Byte> foreFrame_copy = foreFrame.Copy();
//find the contour
Contour<Point> contours = foreFrame.FindContours(
CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
RETR_TYPE.CV_RETR_EXTERNAL);
//looping every contour
while (contours != null)
{
double PPixel = contours.Area;
if (PPixel >= 1400)
{
//get the contour width
WR = contours.BoundingRectangle.Width;
//divide the contour using estimated pixel position
Num = Convert.ToInt32(WR / 40);
if (Num > 1)
{
//save the estimated pixel position for ROI in arraylist
ArrayList XList = new ArrayList();
for (int i = 1; i <= Num; i++)
{
int x = i * WR / Num;
XList.Add(x);
}
//get the estimated pixel position
foreach (int pos in Xlist)
{
//roiWidth= 10px
int roiWidth = (pos-5) + (pos+5);
//roiHeight= 20px
int roiHeight = 20;
int pixValue = 0;
//STEP 2: set the ROI to speed up computation
foreFrame_copy.ROI = new Rectangle(contours.BoundingRectangle.X, contours.BoundingRectangle.Y, roiWidth, roiHeight);
for (int i = (pos-5); i < roiWidth; i++)
{
for (int j = (pos-5); j < (pos+5); j++)
{
pixValue = foreFrame_copy.Data[i, j, 0];
//find the white pixel
if (pixValue == 255) {
//find the position of minimum pixel
if (j < j-1) {
minPix.X = i;
minPix.Y = j;
}
}
}
}
}
}
//draw the red rectangle
estimatedFrame.Draw(contours.BoundingRectangle, new Bgr(Color.Red), 1);
contours = contours.HNext;
}
else
{
contours = contours.HNext;
}
}
//show frame in framebox
blobBox.Image = foreFrame_copy;
estimatedBox.Image = estimatedFrame;
Emgu CVを使用してステップ2〜5を最速で実行する方法を教えてください。誰かがこれらの3つのステップといくつかのコードを詳しく説明してくれれば幸いです。
よろしくお願いします、デビッド