C#emgu将emgu捕获的图像保存到MySQL数据库

时间:2014-06-17 17:42:51

标签: c# mysql blob emgucv

我能够将emgu图像格式转换为字节字符串,这样可以使用此代码保存在MySQL数据库中,但图像以Windows图像查看器甚至无法识别的格式保存

            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();
                }

我的问题在我尝试添加最终图像格式时开始我在system not supported行上得到fs = new FileStream(named, FileMode.Open, FileAccess.Read);例外,我不确定文件流是如何工作的,(C#的新手)所以请原谅我在代码中有任何明显的错误,我在windows 8 os,vs 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();

我可以将保存在我电脑上的转换图像和手动下载这些图像与软件一起使用的图像手动下载,所以令我感到遗憾的是我知道它有编码错误。

添加数据库表如下:

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)
    {

    }
  }

}

1 个答案:

答案 0 :(得分: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())
                {                    
                }