2013-04-01 22 views
1

我是一個在javacv中探索人臉檢測程序,它完美的作品。它捕捉視頻,需要20fps並傳遞給FaceDetection類來檢測臉部。處理後的圖像然後發送回實時饋送。如果檢測到臉部,則會在臉部周圍繪製矩形。我需要在面部檢測到的圖像中添加一些文字以及矩形。我嘗試使用cvPutText方法。但是它顯示了一個錯誤,「cvPutText對於FaceDetection類型是未定義的」。如何在IplImage上編寫文本?

FaceDetection.java的代碼:

import static com.googlecode.javacv.cpp.opencv_core.CV_AA; 
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U; 
import static com.googlecode.javacv.cpp.opencv_core.cvClearMemStorage; 
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem; 
import static com.googlecode.javacv.cpp.opencv_core.cvLoad; 
import static com.googlecode.javacv.cpp.opencv_core.cvPoint; 
import static com.googlecode.javacv.cpp.opencv_core.cvRectangle; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_INTER_LINEAR; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvEqualizeHist; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvResize; 
import static com.googlecode.javacv.cpp.opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING; 
import static com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects; 
import static com.googlecode.javacv.cpp.opencv_objdetect.cvReleaseHaarClassifierCascade; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import com.googlecode.javacv.cpp.opencv_core.CvFont; 
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage; 
import com.googlecode.javacv.cpp.opencv_core.CvRect; 
import com.googlecode.javacv.cpp.opencv_core.CvScalar; 
import com.googlecode.javacv.cpp.opencv_core.CvSeq; 
import com.googlecode.javacv.cpp.opencv_core.Cv_iplCreateImageHeader; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 
import com.googlecode.javacv.cpp.opencv_imgproc.CvDistanceFunction; 
import com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade; 

@SuppressWarnings("unused") 
public class FaceDetection 
{ 
    private static final int SCALE = 2; 
          public int j=0,k=0,no,total; 
          public String timeStamp; 
          public int w=0,h=0,distance=0; 
          public String viewers,dist; 
          FileWriter out; 

    public IplImage FaceDetections(IplImage origImg,int no) throws IOException 
    {   
       out = new FileWriter("D:/log.csv",true);    
       String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(Calendar.getInstance().getTime()); 
       if(no==1) 
       { 
        out.append("\n From "+timeStamp+"\n"); 
        out.append("Serial No,Face Coordinates,Face No,TimeStamp,Distance,count\n"); 
       } 
        String CASCADE_FILE ="C:/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml"; 
          try 
          {        
              IplImage grayImg = IplImage.create(origImg.width(),origImg.height(), IPL_DEPTH_8U, 1); 
              cvCvtColor(origImg, grayImg, CV_BGR2GRAY); 
              IplImage smallImg = IplImage.create(grayImg.width()/SCALE,grayImg.height()/SCALE, IPL_DEPTH_8U, 1); 
              cvResize(grayImg, smallImg, CV_INTER_LINEAR);            
              IplImage equImg = IplImage.create(smallImg.width(),smallImg.height(), IPL_DEPTH_8U, 1); 
              cvEqualizeHist(smallImg, equImg);           
              CvMemStorage storage = CvMemStorage.create(); 
              CvHaarClassifierCascade cascade =new CvHaarClassifierCascade(cvLoad(CASCADE_FILE));             
              CvSeq faces = cvHaarDetectObjects(equImg, cascade, storage,1.1, 3, CV_HAAR_DO_CANNY_PRUNING);           
              cvClearMemStorage(storage);  
              cvReleaseHaarClassifierCascade(cascade); 
              total = faces.total();                
              for (int i = 1; i <= total; i++) 
              { 
                  CvRect r = new CvRect(cvGetSeqElem(faces, i));      
                  cvRectangle(origImg, cvPoint(r.x()*SCALE, r.y()*SCALE),cvPoint((r.x() + r.width())*SCALE,(r.y() + r.height())*SCALE),CvScalar.BLUE, 2, CV_AA, 0);   
                  String strRect = String.format("%d-%d-%d-%d ", r.x(), r.y(), r.width(), r.height());                                            
                  out.append(no+","+strRect+","+i+" ,"+timeStamp+","+distance+","+total+"\n"); 
                  System.out.println(" "+strRect); 

                  CvFont font; 
                  cvInitFont(font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5); 
                  cvPutText(origImg,"male",cvPoint(100,200),&font,CvScalar.BLUE);              
              } 
              out.flush(); 
              out.close(); 
              CvSeq.deallocateReferences(); 
          } 

       catch(Exception e) 
       { 
          System.out.println("Exception FD"+e); 

       } 
          IplImage equImg = null; 
          IplImage smallImg=null; 
          IplImage grayImg =null; 
          return origImg; 
      } 

}

是否有任何其他的方式來添加文本的IplImage?我正在使用opencv 2.4.4

+1

在「未定義的類型」上搜索更多信息。 – William

回答

2

cvPutText() isthe wayto go

error message很有趣,您撥打cvPutText()時沒有問題,所以問題必須出現在代碼的其他部分。請確保您正在導入:

import static com.googlecode.javacv.cpp.opencv_core.cvPutText; 
+0

Thanks..it works ..但仍然「CV_FONT_HERSHEY_SIMPLEX」無法解析爲它顯示的變量錯誤。 –

+0

也許它可以像以前的錯誤一樣修復? – karlphillip

+0

我已經包含「import com.googlecode.javacv.cpp.opencv_core.CvFont;」但它說cvInitFont對於FaceDetection類型是未定義的。:(: –

相關問題