2014-06-17 5 views
0

emgu 이미지 형식을 바이트 문자열로 변환 할 수 있으며이 코드로 MySQL 데이터베이스에 저장되지만 이미지는 인식되지 않는 형식으로 저장됩니다. 나는 내가 fs = new FileStream(named, FileMode.Open, FileAccess.Read); 줄에 system not supported 예외가 최종 이미지의 서식을 추가 할 때 창 이미지 뷰어에 의해emgu 캡처 한 이미지를 MySQL 데이터베이스에 저장

  string myConnection = mydbconnection; 

      MySqlConnection myConn = new MySqlConnection(myConnection); 

      myConn.Open(); 

      Bitmap image = trained.ToBitmap(); 

      MemoryStream ms = new MemoryStream(); 

      image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

      byte[] picture = ms.ToArray(); 

      string formmattedPic = Convert.ToBase64String(picture); 

      MySqlCommand cmd = new MySqlCommand("INSERT INTO sql434250.facialid (timeanddate,photo1) VALUES(@named,@Trainedface)",myConn); 

      cmd.Parameters.Add("@named", MySqlDbType.VarChar).Value = named; 
      cmd.Parameters.Add("@Trainedface", MySqlDbType.Blob); 
      cmd.Parameters["@Trainedface"].Value = formmattedPic; 


        cmd.ExecuteNonQuery(); 

        label4.Text = named.ToString(); 

        myConn.Close(); 
       } 

내 문제는 내가 (C#을 새로운)를 파일 스트림 작품, 그래서 용서하시기 바랍니다 방법 확실하지 않다, 시작 코드에있는 모든 명백한 실수에 대한 정보, 윈도우 8 OS, 2013에 대 한있어

여기에 :

  FileStream fs; 

      BinaryReader br; 


     byte[] ImageData; 



     **fs = new FileStream(named, FileMode.Open, FileAccess.Read);** 

     br = new BinaryReader(fs); 

     ImageData = br.ReadBytes((int)fs.Length); 

     br.Close(); 

     fs.Close(); 




      MySqlCommand cmd = new MySqlCommand("INSERT INTO sql434250.facialid (timeanddate,photo1) VALUES(@named,@Trainedface)",myConn); 

      cmd.Parameters.Add("@named", MySqlDbType.VarChar).Value = named; 
      cmd.Parameters.Add("@Trainedface", MySqlDbType.Blob); 
      cmd.Parameters["@Trainedface"].Value = ImageData; 


        cmd.ExecuteNonQuery(); 

나는 내 PC에 저장된 변환 된 이미지를 가지고 내 부끄러움을 나는 그것의 코딩 오류 알 수 있도록 수동으로 MySQL의 사이트를 통해 이러한 이미지는 소프트웨어와 함께 작동합니까 이미지를 다운로드 할 수 있어요.

CREATE TABLE `**yourdatabase**`.`facialid` (
`id` int(11) NOT NULL AUTO_INCREMENT , 
`timeanddate` varchar(30) NOT NULL , 
`photo1` longblob NOT NULL , 
`code1` varchar(50) NOT NULL , 
`code2` varchar(50) NOT NULL , 
`code3` varchar(50) NOT NULL , 
PRIMARY KEY (`id`) 

전체 형태 코드

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using Emgu.CV; 
using Emgu.CV.Structure; 
using Emgu.CV.CvEnum; 
using System.IO; 
using System.Diagnostics; 
using MySql.Data.MySqlClient; 
using System.Drawing.Imaging; 


namespace MultiFaceRec 
{ 
public partial class FrmPrincipal : Form 
{ 
    //Declararation of all variables, vectors and haarcascades 
    Image<Bgr, Byte> currentFrame; 
    Capture grabber; 
    HaarCascade face; 
    HaarCascade eye; 
    MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d); 
    Image<Gray, byte> result, TrainedFace = null; 
    Image<Gray, byte> gray = null; 
    Image<Gray, byte> trained = null; 
    Image image1 = null; 
    List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>(); 
    List<string> labels= new List<string>(); 
    List<string> NamePersons = new List<string>(); 
    int ContTrain, t; 
    string name, names = null; 


    public FrmPrincipal() 
    { 
     InitializeComponent(); 
     //Load haarcascades for face detection 
     face = new HaarCascade("haarcascade_frontalface_default.xml"); 
     //eye = new HaarCascade("haarcascade_eye.xml"); 
    } 
    public void dbconnection() 
    { 

     grabber = new Capture(); 
     grabber.QueryFrame(); 
     //Initialize the FrameGraber event 
     Application.Idle += new EventHandler(FrameGrabber); 

     try 
     { 
      //Load of previus trainned faces and labels for each image 

      string myConnection = **"youdbconnection"** 
      MySqlConnection myConn = new MySqlConnection(myConnection); 
      MySqlDataAdapter myAdapter = new MySqlDataAdapter(); 
      int totalrows = 0; 
      int rownumber = 0; 

    MySqlCommand SelectCommand = new MySqlCommand(" select * from  **yourdb**.facialid ", myConn); 

      MySqlDataReader myReader; 

      myConn.Open(); 

      myReader = SelectCommand.ExecuteReader(); 

      int count = 0; 
      while (myReader.Read()) 
      { 
       count = count + 1; 

       string id = myReader.GetString("id"); 
       string Labelsinfo = myReader.GetString("timeanddate"); 
       string picdata = myReader.GetString("photo1"); 
       string LoadFaces; 

       LoadFaces = myReader.GetString("photo1"); 
       byte[] picData = myReader["photo1"] as byte[] ?? null; 



       ImageConverter pic = new ImageConverter(); 
       Image img = (Image)pic.ConvertFrom(myReader["photo1"]); 
       Bitmap bitmap1 = new Bitmap(img); 


       trainingImages.Add(new Image<Gray, byte> (bitmap1)); 
       labels.Add(Labelsinfo); 

       rownumber = count +1; 
       totalrows = count; 
       ContTrain = count; 
       //string userid = myReader.GetString("id"); 
       //string useron = myReader.GetString("user"); 
} 
      myReader.Close(); 
       myConn.Close(); 

      label2.Text = totalrows.ToString(); 


     } 
     catch(MySqlException ex) 
     { 

      //MessageBox.Show(e.ToString()); 
      int errorcode = ex.Number; 
      MessageBox.Show("Nothing in binary database, please add at least a face(Simply train the prototype with the Add Face Button).", "Triained faces load", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 

    } 

    private void button2_Click(object sender, System.EventArgs e) 
    { 
     try 
     { 

      //Trained face counter 
      ContTrain = ContTrain + 1; 

      //Get a gray frame from capture device 
      gray = grabber.QueryGrayFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

      //Face Detector 
      MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
      face, 
      1.2, 
      10, 
      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
      new Size(20, 20)); 

      //Action for each element detected 
      foreach (MCvAvgComp f in facesDetected[0]) 
      { 

       trained = currentFrame.Copy(f.rect).Convert<Gray, byte>(); 
       TrainedFace = currentFrame.Copy(f.rect).Convert<Gray, byte>(); 

       break; 
      } 

      //resize face detected image for force to compare the same size with the 
      //test image with cubic interpolation type method 
      TrainedFace = result.Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

      //string image; 

      //Show face added in gray scale 
      imageBox1.Image = TrainedFace; 


      string named = DateTime.Now.ToString("dd-MM-yy HH:mm:ss:ms"); 

      string myConnection = **"your db connection"** 

      MySqlConnection myConn = new MySqlConnection(myConnection); 

      myConn.Open(); 

      Bitmap image = trained.ToBitmap(); 

      MemoryStream ms = new MemoryStream(); 

      image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

      byte[] picture = ms.ToArray(); 

      string formmattedPic = Convert.ToBase64String(picture); 


      FileStream fs; 

      BinaryReader br; 


     byte[] ImageData; 



     fs = new FileStream(named, FileMode.Open, FileAccess.Read); 

     br = new BinaryReader(fs); 

     ImageData = br.ReadBytes((int)fs.Length); 

     br.Close(); 

     fs.Close(); 




      MySqlCommand cmd = new MySqlCommand("INSERT INTO **yourdb**.facialid (timeanddate,photo1) VALUES(@named,@Trainedface)",myConn); 

      cmd.Parameters.Add("@named", MySqlDbType.VarChar).Value = named; 
      cmd.Parameters.Add("@Trainedface", MySqlDbType.Blob); 
      cmd.Parameters["@Trainedface"].Value = ImageData; 


        cmd.ExecuteNonQuery(); 

        label4.Text = named.ToString(); 

        myConn.Close(); 
       } 


     catch (MySqlException ee) 
     { 
      int errorcode = ee.Number; 

     } 
     } 


    void FrameGrabber(object sender, EventArgs e) 
    { 
     label3.Text = "0"; 
     //label4.Text = ""; 
     NamePersons.Add(""); 


     //Get the current frame form capture device 
     currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

       //Convert it to Grayscale 
       gray = currentFrame.Convert<Gray, Byte>(); 

       //Face Detector 
       MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
       face, 
       1.2, 
       10, 
       Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
       new Size(20, 20)); 

       //Action for each element detected 
       foreach (MCvAvgComp f in facesDetected[0]) 
       { 
        t = t + 1; 
        result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 
        //draw the face detected in the 0th (gray) channel with blue color 
        currentFrame.Draw(f.rect, new Bgr(Color.Red), 2); 


        if (trainingImages.ToArray().Length != 0) 
        { 
         //TermCriteria for face recognition with numbers of trained images like maxIteration 
        MCvTermCriteria termCrit = new MCvTermCriteria(ContTrain, 0.001); 

        //Eigen face recognizer 
        EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
         trainingImages.ToArray(), 
         labels.ToArray(), 
         1000, 
         ref termCrit); 

        name = recognizer.Recognize(result); 

         //Draw the label for each face detected and recognized 
        currentFrame.Draw(name, ref font, new Point(f.rect.X - 2, f.rect.Y - 2), new Bgr(Color.LightGreen)); 

        } 

         NamePersons[t-1] = name; 
         NamePersons.Add(""); 


        //Set the number of faces detected on the scene 
        label3.Text = facesDetected[0].Length.ToString(); 

        /* 
        //Set the region of interest on the faces 

        gray.ROI = f.rect; 
        MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(
         eye, 
         1.1, 
         10, 
         Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
         new Size(20, 20)); 
        gray.ROI = Rectangle.Empty; 

        foreach (MCvAvgComp ey in eyesDetected[0]) 
        { 
         Rectangle eyeRect = ey.rect; 
         eyeRect.Offset(f.rect.X, f.rect.Y); 
         currentFrame.Draw(eyeRect, new Bgr(Color.Blue), 2); 
        } 
        */ 

       } 
        t = 0; 

        //Names concatenation of persons recognized 
       for (int nnn = 0; nnn < facesDetected[0].Length; nnn++) 
       { 
        names = names + NamePersons[nnn] + ", "; 
       } 
       //Show the faces procesed and recognized 
       imageBoxFrameGrabber.Image = currentFrame; 


       //Clear the list(vector) of names 
       NamePersons.Clear(); 

      } 



    private void FrmPrincipal_Load(object sender, EventArgs e) 
    { 
     dbconnection(); 
    } 

    private void label3_Click(object sender, EventArgs e) 
    { 

    } 

    private void label4_Click(object sender, EventArgs e) 
    { 

    } 

    private void label2_Click(object sender, EventArgs e) 
    { 

    } 
    } 

} 
+0

그냥 댓글을 모두 추가 할 같은 의지 편집 게시물을 할 것입니다 그/그녀의 코드 출력을 테스트 테이블을 생성 코드와 전체 코드를 요구 다른 게시물을 읽고 있었다. –

+0

@alex 덕분에 필요한 제안 된 수정 사항을 보내 주셔서 감사합니다. –

답변

0

내가, 내가 뭘 잘못했는지 모르겠어요 내 질문을 해결할 수있었습니다을 추가하지만 조금 복사하여 다음과 같이

는 데이터베이스 테이블을 추가 여기 저기에 다음 코드가 작동합니다. 내가 한 것은 이미지를 로컬 응용 프로그램 파일에 저장 한 다음이 파일 위치를 파일 스트림에 사용하는 것입니다.

   named = DateTime.Now.ToString("dd-MM-yy HH:mm:ss:ms"); 
      TrainedFace.Save(Application.StartupPath + "/Temp/face1.bmp"); 

      string dated = DateTime.Now.ToString("HH:mm:ss:ff dd-MM-yy"); 
      label4.Text = dated; 

      //Show face added in gray scale 
      imageBox1.Image = TrainedFace; 
      trainingImages.Add(TrainedFace); 
      labels.Add(label4.Text); 

      byte[] imagepic = null; 
      FileStream fsstream = new FileStream(Application.StartupPath + "/Temp/face1.bmp", FileMode.Open, FileAccess.Read); 
      BinaryReader br = new BinaryReader(fsstream); 
      imagepic = br.ReadBytes((int)fsstream.Length); 

      string myConnection = "datasource=sql4.freemysqlhosting.net;port=3306;user=sql434250;password=lE3!lQ5*"; 
      MySqlConnection myConn = new MySqlConnection(myConnection); 
      MySqlCommand SelectCommand = new MySqlCommand("INSERT INTO `sql434250`.`facialid` (`id`, `timeanddate`, `photo1`) VALUES (NULL, @dated, @IMG);", myConn); 
      MySqlDataReader myReader; 

       myConn.Open(); 
       SelectCommand.Parameters.Add(new MySqlParameter("@IMG", imagepic)); 
       SelectCommand.Parameters.Add(new MySqlParameter("@dated", dated)); 
       myReader = SelectCommand.ExecuteReader(); 

       while (myReader.Read()) 
       {      
       } 
관련 문제