数日前、私は巨大な牛の人工知能学習ウェブサイトを見つけました。それは理解しやすく、面白くてユーモラスです。私はあなたとそれを共有せずにはいられません:
コンテンツ
1.輪郭検出
次の図は例です。
グレースケール画像は輪郭を直接抽出します。
int main()
{
Mat img = imread("D:/1.png", 0);
resize(img, img, Size(0, 0), 0.5, 0.5);
Mat src=img;
cv::imshow("src", src);
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(src, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point(0, 0));
cout << contours.size()<<endl;
//sort(contours.begin(), contours.end(), cmp< Point>);
//for (int i = 0; i < contours.size(); i++)cout << contours[i].size() << " ";
src = 0;
cv::drawContours(src, contours, -1, cv::Scalar::all(255));
cv::imshow("Contours", src);
cv::waitKey(0);
return 0;
}
結果として得られる等高線の数は、グラフ全体の最も外側の等高線である1です。
最適化のアイデア:最初に特定の2値化プロセスを実行します。
int main()
{
Mat img = imread("D:/1.png", 0);
resize(img, img, Size(0, 0), 0.5, 0.5);
Mat src;
threshold(img, src, 200, 255, THRESH_TRUNC);
threshold(src, src, 100, 255, THRESH_TOZERO);
cv::imshow("src", src);
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(src, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point(0, 0));
cout << contours.size()<<endl;
//sort(contours.begin(), contours.end(), cmp< Point>);
//for (int i = 0; i < contours.size(); i++)cout << contours[i].size() << " ";
src = 0;
cv::drawContours(src, contours, -1, cv::Scalar::all(255));
cv::imshow("Contours", src);
cv::waitKey(0);
return 0;
}
一般に、輪郭を抽出する前にエッジ検出を行うことをお勧めします。
エッジ検出は画像内のピクセルポイントの変化に偏っており、輪郭検出は上位レベルのセマンティックオブジェクトに焦点を合わせる傾向があります。
第二に、エッジ検出
エッジ検出にCanny演算子を使用します。
int main()
{
Mat img = imread("D:/1.png", 0);
resize(img, img, Size(0, 0), 0.5, 0.5);
Mat src;
threshold(img, src, 200, 255, THRESH_TRUNC);
threshold(src, src, 100, 255, THRESH_TOZERO);
Canny(src, src, 200, 100, 3);
cv::imshow("src", src);
cv::waitKey(0);
return 0;
}
エッジ検出の結果は明確です。
完全なアプリケーション: