8

私がやろうとしているのは、眼鏡フレームの厚さを測定することです。フレームの輪郭の厚さを測定するというアイデアがありました (もっと良い方法でしょうか?)。ここまでメガネのフレームの輪郭を描いてきましたが、線が合わないところに隙間があります。HoughLinesP を使用することを考えましたが、これが必要かどうかはわかりません。

これまでのところ、次の手順を実行しました。

  • 画像をグレースケールに変換
  • 目/メガネ領域の周りに ROI を作成する
  • 画像をぼかす
  • 画像を膨張させます (薄いフレームのメガネを取り除くためにこれを行いました)。
  • キャニーエッジ検出の実施
  • 見つかった輪郭

結果は次のとおりです。

これまでの私のコードは次のとおりです。

//convert to grayscale
cv::Mat grayscaleImg;
cv::cvtColor( img, grayscaleImg, CV_BGR2GRAY );

//create ROI
cv::Mat eyeAreaROI(grayscaleImg, centreEyesRect);
cv::imshow("roi", eyeAreaROI);

//blur
cv::Mat blurredROI;
cv::blur(eyeAreaROI, blurredROI, Size(3,3));
cv::imshow("blurred", blurredROI);

//dilate thin lines
cv::Mat dilated_dst;
int dilate_elem = 0;
int dilate_size = 1;
int dilate_type = MORPH_RECT;

cv::Mat element = getStructuringElement(dilate_type, 
    cv::Size(2*dilate_size + 1, 2*dilate_size+1), 
    cv::Point(dilate_size, dilate_size));

cv::dilate(blurredROI, dilated_dst, element);
cv::imshow("dilate", dilated_dst);

//edge detection
int lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;    

cv::Canny(dilated_dst, dilated_dst, lowThreshold, lowThreshold*ratio, kernel_size);

//create matrix of the same type and size as ROI
Mat dst;
dst.create(eyeAreaROI.size(), dilated_dst.type());
dst = Scalar::all(0);

dilated_dst.copyTo(dst, dilated_dst);
cv::imshow("edges", dst);

//join the lines and fill in
vector<Vec4i> hierarchy;
vector<vector<Point>> contours;

cv::findContours(dilated_dst, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
cv::imshow("contours", dilated_dst);

次のステップがどうなるか、または上記で述べたように、HoughLinesP を使用する必要があるかどうか、およびその実装方法が完全にはわかりません。どんな助けでも大歓迎です!

4

2 に答える 2