Maison base de données tutoriel mysql OPENCV+VS2008+SQLserver图片存储数据库开发

OPENCV+VS2008+SQLserver图片存储数据库开发

Jun 07, 2016 pm 03:51 PM
图片 存储

OPENCV+VS2008+SQLserver 图片存储数据库开发 本人是做图像处理方向的,图像存储的数据库开发是一次尝试,开发平台用的是 OPENCV+VS2008+SQLserver , OPENCV 对图片的读取比较方便,而且支持 bmp , jpg , tiff , png 等多种图像格式,数据库访问技术采用

OPENCV+VS2008+SQLserver图片存储数据库开发

本人是做图像处理方向的,图像存储的数据库开发是一次尝试,开发平台用的是OPENCV+VS2008+SQLserverOPENCV对图片的读取比较方便,而且支持bmpjpgtiffpng等多种图像格式,数据库访问技术采用的是ADO,下面我将详细的介绍整个开发过程。

第一步:安装opencv2.0并把cv.lib,cxcore.lib,highgui.lib 这三个库加入到工程里面,具体操作步骤参照http://www.opencv.org.cn/index.php/VC_2008_Express%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.0。安装SQL2005VS2008.

第二步:SQL2005里新建一个新的数据库,名字为management,在management数据库中添加一个表,名字为personalmessage,字段有namesexstudent_number

Picture四个字段,前三个字段为字符型,后一个字段为image类型。

第三步:连接数据库,采用ADO方式

新建了一个类CADOConn,从Cobject派生,并增加以下四个成员函数:

_RecordsetPtr  GetRecordset(_bstr_t bstrSQL,_bstr_t DB_Name);//得到命令对象指针

void ExitConnect();         //退出连接

BOOL OnInitADOConn(_bstr_t DB_Name);   //初始化连接

BOOL Execute(_bstr_t bstrSQL,_bstr_t DB_Name);    //执行sql语言

BOOL CADOConn::Execute(_bstr_t bstrSQL,_bstr_t DB_Name)

{

     try

     {

         if (m_pConnection==NULL)

         OnInitADOConn(DB_Name);

         m_pConnection->Execute(bstrSQL,NULL,adCmdText);

     //   m_pConnection->Execute((LPCSTR)bstrSQL, NULL, adExecuteNoRecords);

 

     }

     catch (_com_error e)

     {

         AfxMessageBox(e.ErrorMessage());

         return false;

     }

     return TRUE;

}

BOOL CADOConn::OnInitADOConn(_bstr_t DB_Name)

{

     ::CoInitialize(NULL);

     try

     {

         m_pConnection.CreateInstance(__uuidof(Connection));

         m_pConnection->PutCursorLocation(adUseClient);

         _bstr_t connectionstring = "Provider=sqloledb;Data Source=";

         connectionstring += _T("WIDOWSXP-CC3F79");

         connectionstring += ";Initial Catalog=";

         connectionstring += DB_Name;

         connectionstring += ";User Id=sa";

         connectionstring += ";Password=82877882";

         connectionstring += ";";

 

         m_pConnection->Open(connectionstring,"","",adConnectUnspecified);

         /*   m_pConnection->ConnectionString="driver={SQL Server};server="";datebase="+DB_Name;

         m_pConnection->Open("","","",NULL);*/

     }

 

     catch (...)

     {

         AfxMessageBox(_T("初始化出错"));

         return false;

     }

     return TRUE;

}

void CADOConn::ExitConnect()

{

 

     m_pConnection->Close();

     ::CoUninitialize();

}

 

_RecordsetPtr CADOConn::GetRecordset(_bstr_t bstrSQL,_bstr_t DB_Name)

{

 

     try

     {

         if(m_pConnection==NULL)

         OnInitADOConn(DB_Name);

         m_pRecordset.CreateInstance(__uuidof(Recordset));

         m_pRecordset->Open(bstrSQL, _variant_t( (IDispatch *) m_pConnection,true), adOpenKeyset,adLockOptimistic, adCmdText);

     }

     catch (_com_error e)

     {

         AfxMessageBox(e.ErrorMessage());

         //return m_pRecordset=NULL;

     }

     return m_pRecordset;

}

值得注意的是,在OnInitADOConn函数中,如果你的SQL需要用户名和密码登陆的话,里面的IDpassword要对应你自己的SQL登录名和密码,Data Source也要特别注意,代表你数据库注册的服务器名,我的是WIDOWSXP-CC3F79。以后在程序中就可以直接调用GetRecordset来获得命令对象指针,从而可以方便的对数据库进行操作。

第四步:图片存入数据库

图片存入数据库的原理就是:把图片转换成二进制形式,存入到image变量中。

由于VCbmp格式的图片处理比较方便,因此我用opencv读取完之后先把图片转换成bmp格式,读取二进制一般都是以文件形式读取,这里我投机取巧了一下,先把图片以bmp格式存放到某个路径中,然后用CFile以文件形式读取,存储到数据库之后再删除掉,删除用的是:CFile::Remove。如果大家有什么好方法还请告知,谢谢!

位图的读取可以参照http://www.programbbs.com/bbs/tree20-5675-29114.htm

我的代码如下:

void CadotestDlg::OnBnClickedadd()

{

     UpdateData(TRUE);

     if(m_name!="")

     {

         CString strSQL;

         CADOConn m_CAdoConn;

         _RecordsetPtr  m_pRecordset;

         //重新添加一个新的记录

         strSQL=_T("select * from personalmessage");

         m_pRecordset=m_CAdoConn.GetRecordset((_bstr_t)strSQL,(_bstr_t)("management"));

         m_pRecordset->AddNew();

         m_pRecordset->PutCollect((_bstr_t)"name",(_bstr_t)m_name);

         m_pRecordset->PutCollect((_bstr_t)"sex",(_bstr_t)m_sex);

         m_pRecordset->PutCollect((_bstr_t)"student_number",(_bstr_t)m_student_number);

 

         if(m_pic1)

         {

              cvSaveImage("D://SQL//adotest//adotest//1.bmp",m_pic1);

              //保存在"management"数据库中的"personalmessage",字段名"picture"

              CFile f;

              // TODO: Add your control notification handler code here

              CString  FilePathName("D://SQL//adotest//adotest//1.bmp");

              CFileException e;

              if(f.Open(FilePathName, CFile::modeRead | CFile::typeBinary, &e))

              {   

                   int nSize = f.GetLength();          //先得到文件长度

                   BYTE * pBuffer = new BYTE [nSize];  //按文件的大小在堆上申请一块内存

                   if (f.Read(pBuffer, nSize) > 0 )    //把文件读到pBuffer(堆上申请一块内存)

                   {  

                       BYTE *pBuf = pBuffer;     ///下面这一大段是把pBuffer里的数据放到库中

                       VARIANT            varBLOB;

                       SAFEARRAY     *psa;

                       SAFEARRAYBOUND     rgsabound[1];

 

                       if(pBuf)

                       {   

                            rgsabound[0].lLbound = 0;

                            rgsabound[0].cElements = nSize;

                            psa = SafeArrayCreate(VT_UI1, 1, rgsabound);

                            for (long i = 0; i long)nSize; i++)

                                 SafeArrayPutElement (psa, &i, pBuf++);

                            varBLOB.vt = VT_ARRAY | VT_UI1;

                            varBLOB.parray = psa;

                            m_pRecordset->GetFields()->GetItem("picture")->AppendChunk(varBLOB);

                       }

                       delete [] pBuffer;     //删掉堆上申请的那一块内存

                       pBuf=0;                //以防二次乱用

                   }

                   f.Close();                //这里一定要记得先关闭文件,后面再Remove,否则会出现共享冲突

                   CFile::Remove( L"D://SQL//adotest//adotest//1.bmp" );

 

              }

              m_pRecordset->Update();

              m_CAdoConn.ExitConnect();

 

         }

         MessageBox(L"添加成功");

     }

     else

     {

         MessageBox(L"无信息添加");

     }

     m_student_number=m_name=m_sex="";

     m_pic1=0;

     UpdateData(FALSE);

 

 

}

第五步:读取图片

代码如下:

long nSize = m_pRecordset->GetFields()->GetItem("picture")->ActualSize;

if(nSize > 0)

         {

              _variant_t    varBLOB;

              varBLOB = m_pRecordset->GetFields()->GetItem("picture")->GetChunk(nSize);

              if(varBLOB.vt == (VT_ARRAY | VT_UI1))

              {

                   if(BYTE *pBuffer = new BYTE [nSize+1])         ///重新申请必要的存储空间

                   {   

                       char *pBuf = NULL;

                       SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);

                       memcpy(pBuffer,pBuf,nSize);               ///复制数据到缓冲区m_pBMPBuffer

                       SafeArrayUnaccessData (varBLOB.parray);

 

                       delete [] pBuffer;

                       pBuf=0;

 

                   }

                   //输出文件

                   _variant_t varChunk;

                   HRESULT hr;

                   BYTE *pBuf = NULL;  

                   pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nSize);

                   SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);

 

                   CFile outFile(L"D://SQL//adotest//adotest//2.bmp",CFile::modeCreate|CFile::modeWrite);

                   LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);

                   outFile.Write(buffer,nSize);

                   GlobalUnlock((HGLOBAL)pBuf);

                   outFile.Close();          

                   SafeArrayUnaccessData (varBLOB.parray);

              }

              IplImage *img=cvLoadImage("D://SQL//adotest//adotest//2.bmp");

              DrawPicToHDC(img,IDC_pic2);

              m_pic2=img;

              CFile::Remove( L"D://SQL//adotest//adotest//2.bmp" );

         }

在整个过程中碰到的几个问题:

1. 在数据库读取过程中,如果某个记录为NULL的话,如果直接读取转换就会出错,所以得预先判断,代码如下:

     VARIANT   var   =   m_pRecordset->Fields->Item["name"]->GetValue();  

     if   (   var.vt   !=   VT_NULL   )  

     {  

         m_showname=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect((_bstr_t)"name");

     }  

2. 文件打开之后要记得f.close(),否则就会出现共享冲突()

3. 图像显示在图像控件上的时候,定义的IplImage变量要记得初始化。

4. 载入的位图如果在文件中打开了rc就会出现opened in another editor,解决办法就是在文件视图中,把rc中的bmp关掉就OK了(这个问题因为我把一副图片设为了对话框的背景,然后把图片删除后造成的)

5. 还有就是几个变量类型转换的问题,像CString char*_bstr_tCString互转,我的程序里都有体现,另外一篇文章我也做了说明。

6. 图像的显示用的是

void CadotestDlg::DrawPicToHDC(IplImage *img, UINT ID)        //用于在ID所指定的窗口上显示图片

{

 

     CDC *pDC = GetDlgItem(ID)->GetDC();

     HDC hDC= pDC->GetSafeHdc();

     CRect rect;

     GetDlgItem(ID)->GetClientRect(&rect);

     CvvImage cimg;

     cimg.CopyOf(img);

     cimg.DrawToHDC(hDC,&rect); 

     ReleaseDC(pDC);

}

 

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème de l'enregistrement automatique des images lors de la publication sur Xiaohongshu ? Où est l'image enregistrée automatiquement lors de la publication ? Comment résoudre le problème de l'enregistrement automatique des images lors de la publication sur Xiaohongshu ? Où est l'image enregistrée automatiquement lors de la publication ? Mar 22, 2024 am 08:06 AM

Avec le développement continu des médias sociaux, Xiaohongshu est devenue une plateforme permettant à de plus en plus de jeunes de partager leur vie et de découvrir de belles choses. De nombreux utilisateurs sont gênés par des problèmes de sauvegarde automatique lors de la publication d’images. Alors, comment résoudre ce problème ? 1. Comment résoudre le problème de l'enregistrement automatique des images lors de la publication sur Xiaohongshu ? 1. Vider le cache Tout d'abord, nous pouvons essayer de vider les données du cache de Xiaohongshu. Les étapes sont les suivantes : (1) Ouvrez Xiaohongshu et cliquez sur le bouton « Mon » dans le coin inférieur droit (2) Sur la page du centre personnel, recherchez « Paramètres » et cliquez dessus (3) Faites défiler vers le bas et recherchez « ; "Vider le cache". Cliquez sur OK. Après avoir vidé le cache, entrez à nouveau dans Xiaohongshu et essayez de publier des photos pour voir si le problème de sauvegarde automatique est résolu. 2. Mettez à jour la version Xiaohongshu pour vous assurer que votre Xiaohongshu

Comment publier des photos dans les commentaires TikTok ? Où se trouve l'entrée des photos dans la zone commentaire ? Comment publier des photos dans les commentaires TikTok ? Où se trouve l'entrée des photos dans la zone commentaire ? Mar 21, 2024 pm 09:12 PM

Avec la popularité des courtes vidéos Douyin, les interactions des utilisateurs dans la zone de commentaires sont devenues plus colorées. Certains utilisateurs souhaitent partager des images en commentaires pour mieux exprimer leurs opinions ou émotions. Alors, comment publier des photos dans les commentaires TikTok ? Cet article répondra à cette question en détail et vous fournira quelques conseils et précautions connexes. 1. Comment publier des photos dans les commentaires Douyin ? 1. Ouvrez Douyin : Tout d'abord, vous devez ouvrir l'application Douyin et vous connecter à votre compte. 2. Recherchez la zone de commentaire : lorsque vous parcourez ou publiez une courte vidéo, recherchez l'endroit où vous souhaitez commenter et cliquez sur le bouton "Commentaire". 3. Saisissez le contenu de votre commentaire : saisissez le contenu de votre commentaire dans la zone de commentaire. 4. Choisissez d'envoyer une photo : Dans l'interface de saisie du contenu des commentaires, vous verrez un bouton « image » ou un bouton « + », cliquez sur

6 façons de rendre les images plus nettes sur iPhone 6 façons de rendre les images plus nettes sur iPhone Mar 04, 2024 pm 06:25 PM

Les iPhones récents d'Apple capturent des souvenirs avec des détails, une saturation et une luminosité nets. Mais parfois, vous pouvez rencontrer des problèmes qui peuvent rendre l’image moins claire. Bien que la mise au point automatique sur les appareils photo iPhone ait parcouru un long chemin, vous permettant de prendre des photos rapidement, l'appareil photo peut se concentrer par erreur sur le mauvais sujet dans certaines situations, rendant la photo floue dans les zones indésirables. Si vos photos sur votre iPhone semblent floues ou manquent globalement de netteté, l’article suivant devrait vous aider à les rendre plus nettes. Comment rendre les images plus claires sur iPhone [6 méthodes] Vous pouvez essayer d'utiliser l'application Photos native pour nettoyer vos photos. Si vous souhaitez plus de fonctionnalités et d'options

Comment faire sortir les images ppt une par une Comment faire sortir les images ppt une par une Mar 25, 2024 pm 04:00 PM

Dans PowerPoint, il est courant d'afficher les images une par une, ce qui peut être réalisé en définissant des effets d'animation. Ce guide détaille les étapes de mise en œuvre de cette technique, y compris la configuration de base, l'insertion d'images, l'ajout d'une animation et l'ajustement de l'ordre et du timing de l'animation. De plus, des paramètres et ajustements avancés sont fournis, tels que l'utilisation de déclencheurs, l'ajustement de la vitesse et de l'ordre de l'animation et la prévisualisation des effets d'animation. En suivant ces étapes et conseils, les utilisateurs peuvent facilement configurer les images pour qu'elles apparaissent les unes après les autres dans PowerPoint, améliorant ainsi l'impact visuel de la présentation et attirant l'attention du public.

Comment convertir des documents PDF en images jpg avec Foxit PDF Reader - Comment convertir des documents PDF en images jpg avec Foxit PDF Reader Comment convertir des documents PDF en images jpg avec Foxit PDF Reader - Comment convertir des documents PDF en images jpg avec Foxit PDF Reader Mar 04, 2024 pm 05:49 PM

Utilisez-vous également le logiciel Foxit PDF Reader ? Alors, savez-vous comment Foxit PDF Reader convertit les documents PDF en images jpg ? L'article suivant vous explique comment Foxit PDF Reader convertit les documents PDF en images jpg ? images jpg, venez jeter un oeil ci-dessous. Démarrez d'abord Foxit PDF Reader, puis recherchez « Fonctionnalités » dans la barre d'outils supérieure, puis sélectionnez la fonction « PDF vers autres ». Ensuite, ouvrez une page Web intitulée « Foxit PDF Online Conversion ». Cliquez sur le bouton « Connexion » en haut à droite de la page pour vous connecter, puis activez la fonction « PDF to Image ». Cliquez ensuite sur le bouton de téléchargement et ajoutez le fichier pdf que vous souhaitez convertir en image. Après l'avoir ajouté, cliquez sur "Démarrer la conversion".

Comment utiliser JavaScript pour implémenter la fonction glisser et zoomer des images ? Comment utiliser JavaScript pour implémenter la fonction glisser et zoomer des images ? Oct 27, 2023 am 09:39 AM

Comment utiliser JavaScript pour implémenter la fonction glisser et zoomer des images ? Dans le développement Web moderne, faire glisser et zoomer sur des images est une exigence courante. En utilisant JavaScript, nous pouvons facilement ajouter des fonctions de glisser et de zoom aux images pour offrir une meilleure expérience utilisateur. Dans cet article, nous présenterons comment utiliser JavaScript pour implémenter cette fonction, avec des exemples de code spécifiques. Structure HTML Tout d'abord, nous avons besoin d'une structure HTML de base pour afficher les images et ajouter

Huawei lancera l'année prochaine des produits de stockage MED innovants : la capacité du rack dépasse 10 Po et la consommation électrique est inférieure à 2 kW Huawei lancera l'année prochaine des produits de stockage MED innovants : la capacité du rack dépasse 10 Po et la consommation électrique est inférieure à 2 kW Mar 07, 2024 pm 10:43 PM

Ce site Web a rapporté le 7 mars que le Dr Zhou Yuefeng, président de la gamme de produits de stockage de données de Huawei, a récemment assisté à la conférence MWC2024 et a spécifiquement présenté la solution de stockage magnétoélectrique OceanStorArctic de nouvelle génération conçue pour les données chaudes (WarmData) et les données froides (ColdData). Zhou Yuefeng, président de la gamme de produits de stockage de données de Huawei, a publié une série de solutions innovantes Source de l'image : Le communiqué de presse officiel de Huawei joint à ce site est le suivant : Le coût de cette solution est 20 % inférieur à celui de la bande magnétique, et son coût est de 20 % inférieur à celui de la bande magnétique. la consommation électrique est 90 % inférieure à celle des disques durs. Selon les médias technologiques étrangers blockandfiles, un porte-parole de Huawei a également révélé des informations sur la solution de stockage magnétoélectrique : le disque magnétoélectronique (MED) de Huawei est une innovation majeure dans le domaine des supports de stockage magnétiques. ME de première génération

Comment utiliser HTML, CSS et jQuery pour implémenter des fonctions avancées de fusion et d'affichage d'images Comment utiliser HTML, CSS et jQuery pour implémenter des fonctions avancées de fusion et d'affichage d'images Oct 27, 2023 pm 04:36 PM

Présentation des fonctions avancées d'utilisation de HTML, CSS et jQuery pour implémenter l'affichage de fusion d'images : dans la conception Web, l'affichage d'images est un lien important et l'affichage de fusion d'images est l'une des techniques courantes pour améliorer la vitesse de chargement des pages et améliorer l'expérience utilisateur. Cet article expliquera comment utiliser HTML, CSS et jQuery pour implémenter des fonctions avancées de fusion et d'affichage d'images, et fournira des exemples de code spécifiques. 1. Mise en page HTML : Tout d’abord, nous devons créer un conteneur en HTML pour afficher les images fusionnées. Vous pouvez utiliser di

See all articles