2017-05-22 9 views
-1

私はコンピュータビジョンを初めて勉強しています。アナログ時計(like so => 10:09:00)の写真を見ると、自動的に時計の時刻を読むことができます。アナログ時計のタイムアウトを読み取るには?

私はopencvでいくつかの読書と実験を行いました。そして、最も良い方法は、まずface of the watch from the environmentを抽出してからhough probabilistic function to extract the handsを適用するようです。次に、線とその角度で、時間を計算します。

これは素晴らしいとはいえ、私はコードサンプルを見つけるのが手間です。 コードサンプル、ブログ、YouTube動画、チュートリアル、ライブラリを知っていますか?

どうすればいいですか?

私は

Watch face detection ウォッチ顔検出

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src, gray; 
    src = imread(argv[1], 1);resize(src,src,Size(640,480)); 
    cvtColor(src, gray, CV_BGR2GRAY); 
    imshow("Input", src); 

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

    vector<Vec3f> circles; 

    // Apply the Hough Transform to find the circles 
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 30, 200, 50, 0, 0); 

    // Draw the circles detected 
    for(size_t i = 0; i < circles.size(); i++) 
    { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
     int radius = cvRound(circles[i][2]);  
     circle(src, center, 3, Scalar(0,255,0), -1, 8, 0);// circle center  
     circle(src, center, radius, Scalar(0,0,255), 3, 8, 0);// circle outline 
     cout << "center : " << center << "\nradius : " << radius << endl; 
    } 

    imshow("Circle Detection", src); 

    waitKey(0); 
    return 0; 
} 

enter image description here 線検出

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src = imread(argv[1], 0); 

    Mat dst, cdst, pdst; 
    Canny(src, dst, 50, 200, 3); 
    cvtColor(dst, cdst, CV_GRAY2BGR); 
    cvtColor(dst, pdst, CV_GRAY2BGR); 

    vector<Vec2f> lines; 
    // detect lines 
    HoughLines(dst, lines, 1, CV_PI/180, 122, 0, 0); 

    // draw lines 
    for(size_t i = 0; i < lines.size(); i++) 
    { 
     float rho = lines[i][0], theta = lines[i][1]; 
     Point pt1, pt2; 
     double a = cos(theta), b = sin(theta); 
     double x0 = a*rho, y0 = b*rho; 
     pt1.x = cvRound(x0 + 1000*(-b)); 
     pt1.y = cvRound(y0 + 1000*(a)); 
     pt2.x = cvRound(x0 - 1000*(-b)); 
     pt2.y = cvRound(y0 - 1000*(a)); 
     line(cdst, pt1, pt2, Scalar(0,255,0), 3, CV_AA); 
    } 

    imshow("source", src); 
    imshow("Hough detected lines", cdst); 


    vector<Vec4i> plines; 
    HoughLinesP(dst, plines, 1, CV_PI/180, 50, 50, 10); 
    for(size_t i = 0; i < plines.size(); i++) 
    { 
     Vec4i l = plines[i]; 
     // draw the lines 
     line(pdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA); 
    } 
    imshow("Probabilistic Hough detected lines", pdst); 

    waitKey(); 
    return 0; 
} 

おかげで、で午前のはここですM.

答えて

1

あなたが投稿した画像例はかなり難しいものです。しかし、アプローチはかなり良いです。

この方法で構築を続けたい場合は、円の外にあり、円の中心の近傍を横切らない線を削除することをお勧めします。それから、時間と分の手を隔てる方法が必要です。

数百の画像を見つけることができれば、ハールサークルよりも時計を検出するHaarクラシファイアを訓練するほうがよいでしょう。また、時計の切り抜かれたイメージを見て、時間を伝えるために深いニューラルネットワークを訓練するのもすてきです。

関連する問題