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

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

当我尝试添加最终图像格式时,我的问题开始出现,fs = new FileStream(named, FileMode.Open, FileAccess.Read); 出现系统不支持异常; 行,我不确定文件流是如何工作的,(C# 新手)所以请原谅我代码中的任何明显错误,有关信息我使用的是 Windows 8 操作系统,而不是 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();

我能够将转换后的图像保存在我的电脑上,并通过 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)
    {

    }
  }

}

最佳答案

我能够解决我的问题,我不知道我做错了什么,但是通过在这里和那里进行一些复制,以下代码就可以工作,我所做的就是首先将图像存储到本地应用程序文件并使用它文件在文件流中的位置。

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

关于C# emgu 将 emgu 捕获的图像保存到 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270161/

相关文章:

php - 我应该使用什么数据类型在 MySQL 上存储长加密消息?

c# - 如何使用 slider 纠正高音量下降

c# - DirectX 实时纹理

c# - 可以同时阅读字典吗?

tomcat - 从数据库打开 Xlsx

javascript - 生成一个 div 的图像并另存为

C# DataRow.ToString() 在不应该时自动格式化字符串

php - 灯 : Why php in apache will not race for the mysql db connection?

mysql - SO类消息的DB设计以及如何查询?

mysql - 导致 mysql 抛出错误的设置