1

今は学校が休みなので、いくつかのスキルを習得することにしたので、Visual Studio C++ で OpenCV 機能を使用してカートンに入っている缶の数を検出し、4 つずつグループ化する方法を学ぼうとしています。 ここに画像の説明を入力

「 opencv find:contour 」などのデモコードをいろいろ試してみましたが、テンプレートマッチング(上蓋の回転を検出できないのでうまくいきません)

私が見つけた最良の方法は、キャニーエッジ検出の出力結果がハフ変換円の入力画像になるように、キャニーエッジ検出とハフ変換円を組み合わせることです。結果は次のようになります。

ここに画像の説明を入力

残念ながら、すべての円が検出されるわけではありません。

for (int i = 0; i < circles.size(); i++) の中へ

for (int i = 0; i < 24; i++) // 24 is the no. of cans

Expression: vector subscript が範囲外になります。21個の円しか検出できない理由がわかりません

以下のソースコード: -

using namespace cv;
using namespace std;
Mat src, src_gray;

int main()
{
Mat src1;

src1 = imread("cans.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow("Original image", CV_WINDOW_AUTOSIZE);
imshow("Original image", src1);


Mat gray, edge, draw;
cvtColor(src1, gray, CV_BGR2GRAY);

Canny(gray, edge,50, 150, 3);
//50,150,3

edge.convertTo(draw, CV_8U);
namedWindow("Canny Edge", CV_WINDOW_AUTOSIZE);
imshow("Canny Edge", draw);
imwrite("output.jpg", draw);


waitKey(500);




/// Read the image
src = imread("output.jpg", 1);
Size size(932, 558);//the dst image size,e.g.100x100
resize(src, src, size);//resize image

/// Convert it to gray
cvtColor(src, src_gray, CV_BGR2GRAY);

/// Reduce the noise so we avoid false circle detection
GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2);

vector<Vec3f> circles;

/// Apply the Hough Transform to find the circles
HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows / 8,200, 100, 0, 0);

/// Draw the circles detected
for (int i = 0; i < circles.size(); i++)
{
    printf("are you um?\n");
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    // circle center
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(255, 0, 255), 3, 8, 0);
}

//  namedWindow("Hough Circle Transform Demo", CV_WINDOW_NORMAL);
    imshow("Hough Circle Transform Demo", src);
    line(src, Point(0, 288), Point(1024, 288), Scalar(225, 220, 225), 2, 8);
    // middle line
    line(src, Point(360, 0), Point(360, 576), Scalar(225, 220, 225), 2, 8);
    //break cans into 4 by 4
    line(src, Point(600, 0), Point(600, 576), Scalar(225, 220, 225), 2, 8);
                             //      x, y  
    imshow("Lines", src);
    imwrite("lineoutput.jpg", src);


    waitKey(0);


    return 0;
}

また、線の座標を手動で入力して、4 x 4 にグループ化しました。ここに画像の説明を入力 下付き文字が範囲外のエラーを起こさず、すべての円を検出できるようにするには、何を変更すればよいでしょうか?

4

1 に答える 1

2

さて、私自身の質問を解決しました。CV_BGR2GRAY を CV_RGB2GRAY に変更し、ファイルの比率を小さくし、円の最小半径を変更し、別のしきい値を適用して円を取得しました。ここに画像の説明を入力

于 2016-09-22T10:19:16.043 に答える