私がやろうとしているのは、眼鏡フレームの厚さを測定することです。フレームの輪郭の厚さを測定するというアイデアがありました (もっと良い方法でしょうか?)。ここまでメガネのフレームの輪郭を描いてきましたが、線が合わないところに隙間があります。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 を使用する必要があるかどうか、およびその実装方法が完全にはわかりません。どんな助けでも大歓迎です!