2
int t = 0;
//char u;
// Loop controling vars
char keypress;
bool quit = false;
while (quit == false)
{   pFrame = cvQueryFrame(pCapture);//

   cvLine(pFrame,                        /* the dest image */
       cvPoint(0, 240),             /* start point */
       cvPoint(640, 240),            /* end point */
       cvScalar(0, 255, 0, 0),      /* the color; green */
       1, 8, 0);                    /* thickness, line type, shift */



    CvMemStorage* storage = cvCreateMemStorage(0);
    cvCvtColor(pFrame, tempFrame, CV_BGR2GRAY);
    pProcessedFrame = findEdges(pFrame, lowSliderPosition, highSliderPosition, 3);//Επεξεργάσου για να βρεις τις άκρες
    cvSmooth(tempFrame, tempFrame, CV_GAUSSIAN, 11, 11);//Για να αποφευχθούν λάθος εμφανίσεις κύκλου.


    CvSeq* circles = cvHoughCircles(tempFrame, storage, CV_HOUGH_GRADIENT, 1, tempFrame->height/4, 50, 50, 20, 75);
    for (size_t i = 0; i < circles->total; i++)
 {
     // round the floats to an int
     float* p = (float*)cvGetSeqElem(circles, i);
 cv::Point center(cvRound(p[0]), cvRound(p[1]));

     int radius = cvRound(p[2]);
     cvCircle(pFrame, center, 3, CV_RGB(0,255,0), -1, 8, 0 );//Ζωγράφισε το κέντρο του κύκλου.
     cvCircle(pFrame, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );//Ζωγράφισε το περίγραμμα του κύκλου.
 if (center.y == 240 )
     {cvWaitKey(150);    
 t++;
  }
 else
 {}
 printf("x: %d y: %d r: %d t: %d\n",center.x,center.y, radius,t);
  }

 CvFont font;
     cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, CV_AA);
 cvPutText(pProcessedFrame, "blabla", cvPoint(10, 130), &font, cvScalar(255, 255, 255, 0));

    cvShowImage("WebCam", pFrame);//Εμφάνισε τα κανονικά frame στο παράθυρο αυτό
    cvShowImage("Processed WebCam", pProcessedFrame);//Δείξε τα επεξεργασμένα frame στο παράθυρο αυτό.

    keypress = cvWaitKey(20);//Περίμενε 20 msec.
    if (keypress == 27)//Άλλαξε το flag σε quit αν πατηθεί το πλήκτρο escape.
    {
        quit = true;
    }} //Τέλος του while

皆さん、こんにちは。この質問はそれほど難しいものではないと思いますが、何らかの理由でインターネット上で答えが見つからないようです。たぶん私はいくつかの良い研究をしていません。

私のプログラムには、t という名前のカウンター (整数) があります。私が行っているいくつかのカメラの相互作用に応じて、時々変化します。これを、pProcessedFrame という名前のビデオ結果に表示したいだけです。

ここに含まれているコマンド cvPutText は、特定のテキストしか表示できないため、機能しません。前述のように、時々変更したいと思います。

私が認識していない他のコマンドはありますか?

@@編集@@

わかりました、これは以下で答えられました。最後の while コードと宣言を入れているだけです。いつか誰かがこれを必要とするかもしれません。どうもありがとうございました。xD

    int t = 0;
char u=0;
// Loop controling vars
char keypress;
bool quit = false;
char msg[4*1024] = { 0 };
int frame_num = 0;

while (quit == false)
{
pFrame = cvQueryFrame(pCapture);
cvLine(pFrame,                        
    cvPoint(0, 240),            
    cvPoint(640, 240),    
    cvScalar(0, 255, 0, 0), 1, 8, 0);
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor(pFrame, tempFrame, CV_BGR2GRAY);
pProcessedFrame = findEdges(pFrame, lowSliderPosition, highSliderPosition, 3);
cvSmooth(tempFrame, tempFrame, CV_GAUSSIAN, 11, 11);


CvSeq* circles = cvHoughCircles(tempFrame, storage, CV_HOUGH_GRADIENT, 1, tempFrame->height/4, 50, 50, 20, 60);

      for (size_t i = 0; i < circles->total; i++)
      {
          // round the floats to an int
          float* p = (float*)cvGetSeqElem(circles, i);
      cv::Point center(cvRound(p[0]), cvRound(p[1]));

          int radius = cvRound(p[2]);
          cvCircle(pFrame, center, 3, CV_RGB(0,255,0), -1, 8, 0 );
          cvCircle(pFrame, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );
      if (center.y == 240 )
          {
      cvWaitKey(200);    
      t++;
          frame_num=t;
      }
       else
      {}
      printf("x: %d y: %d r: %d t: %d\n",center.x,center.y, radius,t);
      }     

      sprintf(msg, "Counter: %d", frame_num);
      cvPutText (pFrame, msg, cvPoint(50,100), &font, cvScalar(255,255,0));             
      cvShowImage("WebCam", pFrame);
      cvShowImage("Processed WebCam", pProcessedFrame);

      keypress = cvWaitKey(20);
      if (keypress == 27)
      {
      quit = true;
          }}
4

1 に答える 1

1

cvPutText()まさにあなたが探しているものです。

最初のヒントは、ちょっとした最適化です。次のコードを whileループの前に置きます。必要なフォント タイプは 1 つだけなので、ループの反復ごとに再作成する必要はありません。

CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 1, CV_AA);

ここで、理解する必要のある内容に戻ります: の 2 番目のパラメーターcvPutText()は型const char*です。したがって、ループの反復ごとに異なるテキストを含む変数を渡すだけで済みます。

以下の例では、キャプチャ インターフェイスからフレームを取得し、画面に表示される各画像にフレーム番号を書き込みます。

while (key != 27)
{
    img = cvQueryFrame(capture);
    if (!img)
    {
        fprintf(stderr, "!!! Failed to retrive frame!\n" );
        break;
    }

    // convert int to char*
    char msg[4*1024] = { 0 };
    sprintf(msg, "Frame number: %d", frame_num);

    cvPutText (img, msg, cvPoint(50,200), &font, cvScalar(255,255,0));
    frame_num++;

    cvShowImage("result", img);
    key = cvWaitKey(33);
}
于 2012-10-14T02:00:07.237 に答える