Rumah pangkalan data tutorial mysql OPENCV+VS2008+SQLserver图片存储数据库开发

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

Jun 07, 2016 pm 03:51 PM
gambar penyimpanan

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

}

 

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? Di manakah imej yang disimpan secara automatik semasa menyiarkan? Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? Di manakah imej yang disimpan secara automatik semasa menyiarkan? Mar 22, 2024 am 08:06 AM

Dengan perkembangan media sosial yang berterusan, Xiaohongshu telah menjadi platform untuk lebih ramai golongan muda berkongsi kehidupan mereka dan menemui perkara yang indah. Ramai pengguna bermasalah dengan isu autosimpan semasa menyiarkan imej. Jadi, bagaimana untuk menyelesaikan masalah ini? 1. Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? 1. Kosongkan cache Pertama, kita boleh cuba mengosongkan data cache Xiaohongshu. Langkah-langkahnya adalah seperti berikut: (1) Buka Xiaohongshu dan klik butang "Saya" di sudut kanan bawah (2) Pada halaman tengah peribadi, cari "Tetapan" dan klik padanya (3) Tatal ke bawah dan cari "; Kosongkan Cache". Klik OK. Selepas mengosongkan cache, masukkan semula Xiaohongshu dan cuba siarkan gambar untuk melihat sama ada masalah penjimatan automatik telah diselesaikan. 2. Kemas kini versi Xiaohongshu untuk memastikan bahawa Xiaohongshu anda

Bagaimana untuk menyiarkan gambar dalam ulasan TikTok? Di manakah pintu masuk ke gambar di ruang komen? Bagaimana untuk menyiarkan gambar dalam ulasan TikTok? Di manakah pintu masuk ke gambar di ruang komen? Mar 21, 2024 pm 09:12 PM

Dengan populariti video pendek Douyin, interaksi pengguna di kawasan komen menjadi lebih berwarna. Sesetengah pengguna ingin berkongsi imej dalam ulasan untuk meluahkan pendapat atau emosi mereka dengan lebih baik. Jadi, bagaimana untuk menyiarkan gambar dalam ulasan TikTok? Artikel ini akan menjawab soalan ini secara terperinci untuk anda dan memberikan anda beberapa petua dan langkah berjaga-jaga yang berkaitan. 1. Bagaimana untuk menyiarkan gambar dalam komen Douyin? 1. Buka Douyin: Pertama, anda perlu membuka APP Douyin dan log masuk ke akaun anda. 2. Cari kawasan ulasan: Apabila menyemak imbas atau menyiarkan video pendek, cari tempat yang anda mahu mengulas dan klik butang "Ulasan". 3. Masukkan kandungan ulasan anda: Masukkan kandungan ulasan anda dalam ruangan komen. 4. Pilih untuk menghantar gambar: Dalam antara muka untuk memasukkan kandungan ulasan, anda akan melihat butang "gambar" atau butang "+", klik

6 Cara Menjadikan Gambar Lebih Tajam pada iPhone 6 Cara Menjadikan Gambar Lebih Tajam pada iPhone Mar 04, 2024 pm 06:25 PM

iPhone terbaru Apple menangkap kenangan dengan perincian, ketepuan dan kecerahan yang jelas. Tetapi kadangkala, anda mungkin menghadapi beberapa isu yang boleh menyebabkan imej kelihatan kurang jelas. Walaupun autofokus pada kamera iPhone telah berjalan jauh dan membolehkan anda mengambil foto dengan cepat, kamera boleh tersalah fokus pada subjek yang salah dalam situasi tertentu, menjadikan foto kabur di kawasan yang tidak diingini. Jika foto anda pada iPhone anda kelihatan tidak fokus atau kurang ketajaman secara keseluruhan, siaran berikut akan membantu anda menjadikannya lebih tajam. Cara Menjadikan Gambar Lebih Jelas pada iPhone [6 Kaedah] Anda boleh cuba menggunakan apl Foto asli untuk membersihkan foto anda. Jika anda mahukan lebih banyak ciri dan pilihan

Cara membuat gambar ppt muncul satu persatu Cara membuat gambar ppt muncul satu persatu Mar 25, 2024 pm 04:00 PM

Dalam PowerPoint, ia adalah teknik biasa untuk memaparkan gambar satu demi satu, yang boleh dicapai dengan menetapkan kesan animasi. Panduan ini memperincikan langkah untuk melaksanakan teknik ini, termasuk persediaan asas, sisipan imej, menambah animasi dan melaraskan susunan dan masa animasi. Selain itu, tetapan dan pelarasan lanjutan disediakan, seperti menggunakan pencetus, melaraskan kelajuan dan susunan animasi, dan pratonton kesan animasi. Dengan mengikuti langkah dan petua ini, pengguna boleh dengan mudah menyediakan gambar untuk muncul satu demi satu dalam PowerPoint, dengan itu meningkatkan kesan visual persembahan dan menarik perhatian penonton.

Bagaimana untuk menukar dokumen pdf ke dalam imej jpg dengan Foxit PDF Reader - Bagaimana untuk menukar dokumen pdf ke dalam imej jpg dengan Foxit PDF Reader Bagaimana untuk menukar dokumen pdf ke dalam imej jpg dengan Foxit PDF Reader - Bagaimana untuk menukar dokumen pdf ke dalam imej jpg dengan Foxit PDF Reader Mar 04, 2024 pm 05:49 PM

Adakah anda juga menggunakan perisian Foxit PDF Reader? Jadi adakah anda tahu bagaimana Foxit PDF Reader menukar dokumen pdf kepada imej jpg Artikel berikut membawa anda bagaimana Foxit PDF Reader menukar dokumen pdf kepada imej jpg imej jpg, sila datang dan lihat di bawah. Mula-mula mulakan Pembaca PDF Foxit, kemudian cari "Ciri" pada bar alat atas, dan kemudian pilih fungsi "PDF kepada Orang Lain". Seterusnya, buka halaman web yang dipanggil "Foxit PDF Online Conversion". Klik butang "Log Masuk" di bahagian atas sebelah kanan halaman untuk log masuk, dan kemudian hidupkan fungsi "PDF ke Imej". Kemudian klik butang muat naik dan tambah fail pdf yang anda ingin tukar kepada imej Selepas menambahnya, klik "Mulakan Penukaran".

Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Oct 27, 2023 am 09:39 AM

Bagaimana untuk menggunakan JavaScript untuk melaksanakan fungsi seret dan zum imej? Dalam pembangunan web moden, menyeret dan mengezum imej adalah keperluan biasa. Dengan menggunakan JavaScript, kami boleh menambahkan fungsi seret dan zum pada imej dengan mudah untuk memberikan pengalaman pengguna yang lebih baik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan JavaScript untuk melaksanakan fungsi ini, dengan contoh kod khusus. Struktur HTML Pertama, kita memerlukan struktur HTML asas untuk memaparkan gambar dan menambah

Cara menggunakan HTML, CSS dan jQuery untuk melaksanakan fungsi lanjutan penggabungan dan paparan imej Cara menggunakan HTML, CSS dan jQuery untuk melaksanakan fungsi lanjutan penggabungan dan paparan imej Oct 27, 2023 pm 04:36 PM

Gambaran keseluruhan fungsi lanjutan tentang cara menggunakan HTML, CSS dan jQuery untuk melaksanakan paparan gabungan imej: Dalam reka bentuk web, paparan imej ialah pautan penting, dan paparan gabungan imej ialah salah satu teknik biasa untuk meningkatkan kelajuan memuatkan halaman dan pengalaman pengguna. Artikel ini akan memperkenalkan cara menggunakan HTML, CSS dan jQuery untuk melaksanakan fungsi lanjutan penggabungan dan paparan imej, dan menyediakan contoh kod khusus. 1. Reka letak HTML: Pertama, kita perlu mencipta bekas dalam HTML untuk memaparkan imej yang digabungkan. Anda boleh menggunakan di

Bagaimana untuk menyusun dua gambar bersebelahan dalam dokumen wps Bagaimana untuk menyusun dua gambar bersebelahan dalam dokumen wps Mar 20, 2024 pm 04:00 PM

Apabila menggunakan perisian pejabat WPS, kami mendapati bahawa bukan sahaja satu bentuk digunakan, jadual dan gambar boleh ditambah pada teks, gambar juga boleh ditambah pada jadual, dll. Ini semua digunakan bersama untuk membuat kandungan keseluruhan dokumen kelihatan lebih kaya , jika anda perlu memasukkan dua gambar ke dalam dokumen dan ia perlu disusun bersebelahan. Kursus seterusnya kami boleh menyelesaikan masalah ini: bagaimana untuk meletakkan dua gambar bersebelahan dalam dokumen wps. 1. Mula-mula, anda perlu membuka perisian WPS dan cari gambar yang ingin anda laraskan. Klik kiri pada gambar dan bar menu akan muncul, pilih "Layout Halaman". 2. Pilih "Pembungkusan ketat" dalam pembungkusan teks. 3. Selepas semua gambar yang anda perlukan disahkan untuk ditetapkan kepada "Pembungkusan teks yang ketat", anda boleh menyeret gambar ke kedudukan yang sesuai dan klik pada gambar pertama.

See all articles