2値化した画像からopencvを用いた円検出をしたい
地球の画像を2値化し,円を検出するプログラムを作りたいと考えています.しかし,プログラムを実行すると,2値化まではうまくできていると思われる画像は結果として表示されるのですが,肝心の円の輪郭が抽出されていませんでした.
自分なりに解決方法を調べたのですが,解決できませんでした.どなたかお力を貸していただきたいです.よろしくお願いします.以下,使用した画像と作成したプログラムです.
該当のソースコード
C++
1#include <iostream> 2#include <opencv2/opencv.hpp> 3 4using namespace std; 5 6int main(){ 7 8// 画像を格納するオブジェクトを宣言する 9 10cv::Mat src = cv::imread("earth15.jpeg", 1); 11 12if (src.empty() == true) { 13 // 画像データが読み込めなかったときは終了する 14 return 0; 15 } 16 17cv::Mat src_gray; //グレースケール画像を入れておくためのMat 18cv::Mat src_bin; //2値画像を入れておくためのMat 19cvtColor(src, src_gray, cv::COLOR_BGR2GRAY); //グレースケールに変換 20threshold(src_gray,src_bin,1,255,cv::THRESH_BINARY); //閾値1で2値画像に変換 21 22 23// Hough円変換 24 vector<cv::Vec3f> circles; 25 26 cv::HoughCircles(src_bin, circles, cv::HOUGH_GRADIENT, 1, 100, 100, 100, 500, 10000); 27 28 for (int i = 0; i < circles.size(); i++) { 29 30 circle(src_bin, cv::Point(circles[i][0], circles[i][1]), circles[i][2], cv::Scalar(0, 255,0 ), 5, cv::LINE_AA); 31 } 32 cv::imshow("Hough円変換", src_bin); 33 34 // 何かキーが押されるまで待つ 35 cv::waitKey(); 36 37 return 0; 38}
試したこと
2値化をせずに,グレースケールの画像のままだと,円を検出した実行結果が得られました.(しかし,地球の柄を検知したため,複数個円が検出されてしまいました)
使用した画像も貼っていただかないと他の人は確認できませんよ
回答3件
あなたの回答
tips
プレビュー