私は非常に高い精度でリアルタイムの形状と色の分類システムを行っています。私の前処理フェーズが十分ではないように思えるので、結果は私が期待したほど正確ではありません。私がやっていることは次のとおりです。リアルタイム画像処理:HSV画像のノイズ(openCV)
- カメラからデータを取り込んでROIを受け取ることができます。
- RGBからHSV空間にROIイメージを変換します。
- メディアンフィルタを使用してHSV画像のノイズを低減します。
- しきい値四角形オブジェクトを検出するfindContoursとapproxPolyDPを用いた画像
- に小孔と小さなオブジェクトを除去するために拡張および浸食用いた画像
- 。
これは私の前段階である:
image_cv = cv::cvarrToMat(image_camera);
Mat cropped = image_cv(cv::Rect(0, 190, 640, 110));
imshow("origin", cropped);
Mat croppedCon = CropConveyor(cropped);
cv::cvtColor(croppedCon, croppedCon, CV_RGB2HSV);
medianBlur(croppedCon, croppedCon, 3);
cv::Mat binRect;
cv::inRange(croppedCon, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), binRect);
これは正方形を検出するためのコードです:
vector<vector<Point>> contours;
findContours(binarizedIm, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
vector<Point> approx;
for (size_t i = 0; i < contours.size(); i++)
{
//double arclength = arcLength(Mat(contours[i]), true);
approxPolyDP(Mat(contours[i]), approx, 3.245 , true); //0.04 for wood
if (approx.size() != 4) continue;
if (isContourConvex(Mat(approx)) && contourArea(Mat(approx)) > 250)
{
double MaxCos = 0;
for (int j = 2; j < 5; j++)
{
double cos = angle(approx[j % 4], approx[j - 1], approx[j - 2]);
MaxCos = MAX(cos, MaxCos);
}
if (MaxCos < 0.2)
squares.push_back(approx);
}
}
私はHSVの画像のノイズが主な理由だと思います。ここに私の問題を説明するいくつかの画像があります。 HSV Imageでノイズが多く見えたので、ノイズを減らすためにメディアフィルタを使用しましたが、findContours関数を使用するときにエッジ情報が非常に重要と考えるので、エッジを保存しています。 HSV and HSV in separate channels 私の質問は次のとおりです。
- のHSV画像のノイズとは何か、上記の画像を参照して、どのように私は私のイメージの品質を向上させる ことができますか?
照明を改善したり、露出を増やすことは可能でしょうか?より大きな開口部、またはそれ以上のISO? –
より良いカメラをお試しください。大学から借りることができるかもしれません。ベトナムでも、適切な機器にアクセスできない場合は、より良いウェブカメラを手に入れることができます。カメラの距離を縮めることで、横方向の解像度を効果的に倍増させることができます。あなたの視野のほとんどは未使用です。 – Piglet