vs2013+Opencv2.4.9+MFC的图像浏览窗口
来源:互联网 发布:hifi音频播放软件 编辑:程序博客网 时间:2024/06/09 19:03
看一下我做出来的简单窗口:
1、首先建议MFC的空项目。
2、然后加一个按钮”图片文件夹“和上面的编辑框,代码如下:
void CMFC_imgDlg::OnBnClickedButton1(){CString str;BROWSEINFO bi;TCHAR name[MAX_PATH];name[0] = 'd';ZeroMemory(&bi, sizeof(BROWSEINFO));bi.hwndOwner = GetSafeHwnd();bi.pszDisplayName = name;bi.lpszTitle = _T("Select folder");bi.ulFlags = 0x80;LPITEMIDLIST idl = SHBrowseForFolder(&bi);if (idl == NULL)return;SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));str.ReleaseBuffer();m_Path = str;if (str.GetAt(str.GetLength() - 1) != '\\')m_Path += "\\";UpdateData(false);m_ImageDir = (LPSTR)(LPCSTR)m_Path;//将图像的dir设置到界面SetDlgItemText(IDC_EDIT1, m_ImageDir);//获取给路径下的第一个文件m_pDir = opendir(m_ImageDir);for (int i = 0; i < 2; i++){m_pEnt = readdir(m_pDir);}GetNextBigImg();}
3、上面实现了两个功能了,然后就是下一张图片的获取功能:
void CMFC_imgDlg::GetNextBigImg(){if (m_pDir&&(m_pEnt=readdir(m_pDir))!=NULL){char* pJpg = strstr(m_pEnt->d_name, ".jpg");char* pBmp = strstr(m_pEnt->d_name, ".Bmp");char* pPng = strstr(m_pEnt->d_name, ".Png");char* pJPG = strstr(m_pEnt->d_name, ".JPG");if (pJpg == NULL&&pBmp == NULL&& pPng == NULL&& pJPG == NULL){GetNextBigImg();}else{ShowTheImgSet(m_pEnt->d_name);}}}
4、将获取的图片显示在图片空间上:
void CMFC_imgDlg::ShowTheImgSet(char* ImageName){char imageFullName[500];sprintf_s(imageFullName, "%s%s", m_ImageDir, ImageName);IplImage* src;CvvImage srcCvvImg;src = cvLoadImage(imageFullName);srcCvvImg.CopyOf(src);srcCvvImg.DrawToHDC(m_HDCImg, &m_RectImg);cvReleaseImage(&src);}
5、然后就是添加一个”下一个“按钮功能:
这个比较简单因为上面已经获取到下一个图片的路径了,只要设置一个函数即可。
void CMFC_imgDlg::OnBnClickedButton2(){GetNextBigImg();}
6、这样基本就完成了。中途会遇到诸多诸多小问题,下面是我的一些小问题解决:
========================================================================================================
第一个、碰到的是CString的类型转换问题,我博客又介绍,比较简单的方法就是直接在项目属性也中常规项,里面的字符集修改为“使用多字节字符集”。
第二个、这两个opendir()、readdir()、在dirent.h中,这个函数在哪呢?VS2013 报错:无法打开包括文件:“dirent.h”。把服务器上的程序考到本机上,自己建了个工程,把.cpp和.h 文件放进去。编译一大堆错误,第一个就是“无法打开包括文件:“dirent.h””。网上搜了搜,原来这个头文件是Linux下的,windows下不包含,最后去网上找了个适用于VS的dirent.h头文件放到了工程里,暂时看起来解决问题。适用于VS的dirent.h下载地址为 :http://www.softagalleria.net/download/dirent/?C=M;O=D 。 然后将里面的一个include下面的.h文件放在如我的vs2013安装目录下D:\VS2013\VC\include。这个问题解决了。或者直接复制我下载的dirent.h文件:
/* * Dirent interface for Microsoft Visual Studio * Version 1.21 * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent. Dirent may be freely distributed * under the MIT license. For all details and documentation, see * https://github.com/tronkko/dirent */#ifndef DIRENT_H#define DIRENT_H/* * Define architecture flags so we don't need to include windows.h. * Avoiding windows.h makes it simpler to use windows sockets in conjunction * with dirent.h. */#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86)# define _X86_#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64)#define _AMD64_#endif#include <stdio.h>#include <stdarg.h>#include <windef.h>#include <winbase.h>#include <wchar.h>#include <string.h>#include <stdlib.h>#include <malloc.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>/* Indicates that d_type field is available in dirent structure */#define _DIRENT_HAVE_D_TYPE/* Indicates that d_namlen field is available in dirent structure */#define _DIRENT_HAVE_D_NAMLEN/* Entries missing from MSVC 6.0 */#if !defined(FILE_ATTRIBUTE_DEVICE)# define FILE_ATTRIBUTE_DEVICE 0x40#endif/* File type and permission flags for stat(), general mask */#if !defined(S_IFMT)# define S_IFMT _S_IFMT#endif/* Directory bit */#if !defined(S_IFDIR)# define S_IFDIR _S_IFDIR#endif/* Character device bit */#if !defined(S_IFCHR)# define S_IFCHR _S_IFCHR#endif/* Pipe bit */#if !defined(S_IFFIFO)# define S_IFFIFO _S_IFFIFO#endif/* Regular file bit */#if !defined(S_IFREG)# define S_IFREG _S_IFREG#endif/* Read permission */#if !defined(S_IREAD)# define S_IREAD _S_IREAD#endif/* Write permission */#if !defined(S_IWRITE)# define S_IWRITE _S_IWRITE#endif/* Execute permission */#if !defined(S_IEXEC)# define S_IEXEC _S_IEXEC#endif/* Pipe */#if !defined(S_IFIFO)# define S_IFIFO _S_IFIFO#endif/* Block device */#if !defined(S_IFBLK)# define S_IFBLK 0#endif/* Link */#if !defined(S_IFLNK)# define S_IFLNK 0#endif/* Socket */#if !defined(S_IFSOCK)# define S_IFSOCK 0#endif/* Read user permission */#if !defined(S_IRUSR)# define S_IRUSR S_IREAD#endif/* Write user permission */#if !defined(S_IWUSR)# define S_IWUSR S_IWRITE#endif/* Execute user permission */#if !defined(S_IXUSR)# define S_IXUSR 0#endif/* Read group permission */#if !defined(S_IRGRP)# define S_IRGRP 0#endif/* Write group permission */#if !defined(S_IWGRP)# define S_IWGRP 0#endif/* Execute group permission */#if !defined(S_IXGRP)# define S_IXGRP 0#endif/* Read others permission */#if !defined(S_IROTH)# define S_IROTH 0#endif/* Write others permission */#if !defined(S_IWOTH)# define S_IWOTH 0#endif/* Execute others permission */#if !defined(S_IXOTH)# define S_IXOTH 0#endif/* Maximum length of file name */#if !defined(PATH_MAX)# define PATH_MAX MAX_PATH#endif#if !defined(FILENAME_MAX)# define FILENAME_MAX MAX_PATH#endif#if !defined(NAME_MAX)# define NAME_MAX FILENAME_MAX#endif/* File type flags for d_type */#define DT_UNKNOWN 0#define DT_REG S_IFREG#define DT_DIR S_IFDIR#define DT_FIFO S_IFIFO#define DT_SOCK S_IFSOCK#define DT_CHR S_IFCHR#define DT_BLK S_IFBLK#define DT_LNK S_IFLNK/* Macros for converting between st_mode and d_type */#define IFTODT(mode) ((mode) & S_IFMT)#define DTTOIF(type) (type)/* * File type macros. Note that block devices, sockets and links cannot be * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are * only defined for compatibility. These macros should always return false * on Windows. */#if !defined(S_ISFIFO)# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)#endif#if !defined(S_ISDIR)# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)#endif#if !defined(S_ISREG)# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)#endif#if !defined(S_ISLNK)# define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)#endif#if !defined(S_ISSOCK)# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)#endif#if !defined(S_ISCHR)# define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)#endif#if !defined(S_ISBLK)# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)#endif/* Return the exact length of d_namlen without zero terminator */#define _D_EXACT_NAMLEN(p) ((p)->d_namlen)/* Return number of bytes needed to store d_namlen */#define _D_ALLOC_NAMLEN(p) (PATH_MAX)#ifdef __cplusplusextern "C" {#endif/* Wide-character version */struct _wdirent { /* Always zero */ long d_ino; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ wchar_t d_name[PATH_MAX];};typedef struct _wdirent _wdirent;struct _WDIR { /* Current directory entry */ struct _wdirent ent; /* Private file data */ WIN32_FIND_DATAW data; /* True if data is valid */ int cached; /* Win32 search handle */ HANDLE handle; /* Initial directory name */ wchar_t *patt;};typedef struct _WDIR _WDIR;static _WDIR *_wopendir (const wchar_t *dirname);static struct _wdirent *_wreaddir (_WDIR *dirp);static int _wclosedir (_WDIR *dirp);static void _wrewinddir (_WDIR* dirp);/* For compatibility with Symbian */#define wdirent _wdirent#define WDIR _WDIR#define wopendir _wopendir#define wreaddir _wreaddir#define wclosedir _wclosedir#define wrewinddir _wrewinddir/* Multi-byte character versions */struct dirent { /* Always zero */ long d_ino; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ char d_name[PATH_MAX];};typedef struct dirent dirent;struct DIR { struct dirent ent; struct _WDIR *wdirp;};typedef struct DIR DIR;static DIR *opendir (const char *dirname);static struct dirent *readdir (DIR *dirp);static int closedir (DIR *dirp);static void rewinddir (DIR* dirp);/* Internal utility functions */static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count);static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count);static void dirent_set_errno (int error);/* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */static _WDIR*_wopendir( const wchar_t *dirname){ _WDIR *dirp = NULL; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate new _WDIR structure */ dirp = (_WDIR*) malloc (sizeof (struct _WDIR)); if (dirp != NULL) { DWORD n; /* Reset _WDIR structure */ dirp->handle = INVALID_HANDLE_VALUE; dirp->patt = NULL; dirp->cached = 0; /* Compute the length of full path plus zero terminator */ n = GetFullPathNameW (dirname, 0, NULL, NULL); /* Allocate room for absolute directory name and search pattern */ dirp->patt = (wchar_t*) malloc (sizeof (wchar_t) * n + 16); if (dirp->patt) { /* * Convert relative directory name to an absolute one. This * allows rewinddir() to function correctly even when current * working directory is changed between opendir() and rewinddir(). */ n = GetFullPathNameW (dirname, n, dirp->patt, NULL); if (n > 0) { wchar_t *p; /* Append search pattern \* to the directory name */ p = dirp->patt + n; if (dirp->patt < p) { switch (p[-1]) { case '\\': case '/': case ':': /* Directory ends in path separator, e.g. c:\temp\ */ /*NOP*/; break; default: /* Directory name doesn't end in path separator */ *p++ = '\\'; } } *p++ = '*'; *p = '\0'; /* Open directory stream and retrieve the first entry */ if (dirent_first (dirp)) { /* Directory stream opened successfully */ error = 0; } else { /* Cannot retrieve first entry */ error = 1; dirent_set_errno (ENOENT); } } else { /* Cannot retrieve full path name */ dirent_set_errno (ENOENT); error = 1; } } else { /* Cannot allocate memory for search pattern */ error = 1; } } else { /* Cannot allocate _WDIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { _wclosedir (dirp); dirp = NULL; } return dirp;}/* * Read next directory entry. The directory entry is returned in dirent * structure in the d_name field. Individual directory entries returned by * this function include regular files, sub-directories, pseudo-directories * "." and ".." as well as volume labels, hidden files and system files. */static struct _wdirent*_wreaddir( _WDIR *dirp){ WIN32_FIND_DATAW *datap; struct _wdirent *entp; /* Read next directory entry */ datap = dirent_next (dirp); if (datap) { size_t n; DWORD attr; /* Pointer to directory entry to return */ entp = &dirp->ent; /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. */ n = 0; while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) { entp->d_name[n] = datap->cFileName[n]; n++; } dirp->ent.d_name[n] = 0; /* Length of file name excluding zero terminator */ entp->d_namlen = n; /* File type */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entp->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entp->d_type = DT_DIR; } else { entp->d_type = DT_REG; } /* Reset dummy fields */ entp->d_ino = 0; entp->d_reclen = sizeof (struct _wdirent); } else { /* Last directory entry read */ entp = NULL; } return entp;}/* * Close directory stream opened by opendir() function. This invalidates the * DIR structure as well as any directory entry read previously by * _wreaddir(). */static int_wclosedir( _WDIR *dirp){ int ok; if (dirp) { /* Release search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; } /* Release search pattern */ if (dirp->patt) { free (dirp->patt); dirp->patt = NULL; } /* Release directory structure */ free (dirp); ok = /*success*/0; } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok;}/* * Rewind directory stream such that _wreaddir() returns the very first * file name again. */static void_wrewinddir( _WDIR* dirp){ if (dirp) { /* Release existing search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); } /* Open new search handle */ dirent_first (dirp); }}/* Get first directory entry (internal) */static WIN32_FIND_DATAW*dirent_first( _WDIR *dirp){ WIN32_FIND_DATAW *datap; /* Open directory and retrieve the first entry */ dirp->handle = FindFirstFileW (dirp->patt, &dirp->data); if (dirp->handle != INVALID_HANDLE_VALUE) { /* a directory entry is now waiting in memory */ datap = &dirp->data; dirp->cached = 1; } else { /* Failed to re-open directory: no directory entry in memory */ dirp->cached = 0; datap = NULL; } return datap;}/* Get next directory entry (internal) */static WIN32_FIND_DATAW*dirent_next( _WDIR *dirp){ WIN32_FIND_DATAW *p; /* Get next directory entry */ if (dirp->cached != 0) { /* A valid directory entry already in memory */ p = &dirp->data; dirp->cached = 0; } else if (dirp->handle != INVALID_HANDLE_VALUE) { /* Get the next directory entry from stream */ if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) { /* Got a file */ p = &dirp->data; } else { /* The very last entry has been processed or an error occured */ FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; p = NULL; } } else { /* End of directory stream reached */ p = NULL; } return p;}/* * Open directory stream using plain old C-string. */static DIR*opendir( const char *dirname) { struct DIR *dirp; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate memory for DIR structure */ dirp = (DIR*) malloc (sizeof (struct DIR)); if (dirp) { wchar_t wname[PATH_MAX]; size_t n; /* Convert directory name to wide-character string */ error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX); if (!error) { /* Open directory stream using wide-character name */ dirp->wdirp = _wopendir (wname); if (dirp->wdirp) { /* Directory stream opened */ error = 0; } else { /* Failed to open directory stream */ error = 1; } } else { /* * Cannot convert file name to wide-character string. This * occurs if the string contains invalid multi-byte sequences or * the output buffer is too small to contain the resulting * string. */ error = 1; } } else { /* Cannot allocate DIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { free (dirp); dirp = NULL; } return dirp;}/* * Read next directory entry. * * When working with text consoles, please note that file names returned by * readdir() are represented in the default ANSI code page while any output to * console is typically formatted on another code page. Thus, non-ASCII * characters in file names will not usually display correctly on console. The * problem can be fixed in two ways: (1) change the character set of console * to 1252 using chcp utility and use Lucida Console font, or (2) use * _cprintf function when writing to console. The _cprinf() will re-encode * ANSI strings to the console code page so many non-ASCII characters will * display correcly. */static struct dirent*readdir( DIR *dirp) { WIN32_FIND_DATAW *datap; struct dirent *entp; /* Read next directory entry */ datap = dirent_next (dirp->wdirp); if (datap) { size_t n; int error; /* Attempt to convert file name to multi-byte string */ error = dirent_wcstombs_s( &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX); /* * If the file name cannot be represented by a multi-byte string, * then attempt to use old 8+3 file name. This allows traditional * Unix-code to access some file names despite of unicode * characters, although file names may seem unfamiliar to the user. * * Be ware that the code below cannot come up with a short file * name unless the file system provides one. At least * VirtualBox shared folders fail to do this. */ if (error && datap->cAlternateFileName[0] != '\0') { error = dirent_wcstombs_s( &n, dirp->ent.d_name, PATH_MAX, datap->cAlternateFileName, PATH_MAX); } if (!error) { DWORD attr; /* Initialize directory entry for return */ entp = &dirp->ent; /* Length of file name excluding zero terminator */ entp->d_namlen = n - 1; /* File attributes */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entp->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entp->d_type = DT_DIR; } else { entp->d_type = DT_REG; } /* Reset dummy fields */ entp->d_ino = 0; entp->d_reclen = sizeof (struct dirent); } else { /* * Cannot convert file name to multi-byte string so construct * an errornous directory entry and return that. Note that * we cannot return NULL as that would stop the processing * of directory entries completely. */ entp = &dirp->ent; entp->d_name[0] = '?'; entp->d_name[1] = '\0'; entp->d_namlen = 1; entp->d_type = DT_UNKNOWN; entp->d_ino = 0; entp->d_reclen = 0; } } else { /* No more directory entries */ entp = NULL; } return entp;}/* * Close directory stream. */static intclosedir( DIR *dirp) { int ok; if (dirp) { /* Close wide-character directory stream */ ok = _wclosedir (dirp->wdirp); dirp->wdirp = NULL; /* Release multi-byte character version */ free (dirp); } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok;}/* * Rewind directory stream to beginning. */static voidrewinddir( DIR* dirp) { /* Rewind wide-character string directory stream */ _wrewinddir (dirp->wdirp);}/* Convert multi-byte string to wide character string */static intdirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count){ int error;#if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 or later */ error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);#else /* Older Visual Studio or non-Microsoft compiler */ size_t n; /* Convert to wide-character string (or count characters) */ n = mbstowcs (wcstr, mbstr, sizeInWords); if (!wcstr || n < count) { /* Zero-terminate output buffer */ if (wcstr && sizeInWords) { if (n >= sizeInWords) { n = sizeInWords - 1; } wcstr[n] = 0; } /* Length of resuting multi-byte string WITH zero terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ error = 0; } else { /* Could not convert string */ error = 1; }#endif return error;}/* Convert wide-character string to multi-byte string */static intdirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, /* max size of mbstr */ const wchar_t *wcstr, size_t count){ int error;#if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 or later */ error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);#else /* Older Visual Studio or non-Microsoft compiler */ size_t n; /* Convert to multi-byte string (or count the number of bytes needed) */ n = wcstombs (mbstr, wcstr, sizeInBytes); if (!mbstr || n < count) { /* Zero-terminate output buffer */ if (mbstr && sizeInBytes) { if (n >= sizeInBytes) { n = sizeInBytes - 1; } mbstr[n] = '\0'; } /* Lenght of resulting multi-bytes string WITH zero-terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ error = 0; } else { /* Cannot convert string */ error = 1; }#endif return error;}/* Set errno variable */static voiddirent_set_errno( int error){#if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 and later */ _set_errno (error);#else /* Non-Microsoft compiler or older Microsoft compiler */ errno = error;#endif}#ifdef __cplusplus}#endif#endif /*DIRENT_H*/
第三个、可能就是opencv版本问题,
如果 遇到IplImage* src;CvvImage srcCvvImg;问题
是没有CvvImage.h,CvvImage.cpp文件,直接添加到项目里面就可以。
CvvImage.h
#pragma once#ifndef CVVIMAGE_CLASS_DEF#define CVVIMAGE_CLASS_DEF#include "opencv.hpp"/* CvvImage class definition */class CvvImage{public:CvvImage();virtual ~CvvImage();/* Create image (BGR or grayscale) */virtual bool Create(int width, int height, int bits_per_pixel, int image_origin = 0);/* Load image from specified file */virtual bool Load(const char* filename, int desired_color = 1);/* Load rectangle from the file */virtual bool LoadRect(const char* filename,int desired_color, CvRect r);#if defined WIN32 || defined _WIN32virtual bool LoadRect(const char* filename,int desired_color, RECT r){return LoadRect(filename, desired_color,cvRect(r.left, r.top, r.right - r.left, r.bottom - r.top));}#endif/* Save entire image to specified file. */virtual bool Save(const char* filename);/* Get copy of input image ROI */virtual void CopyOf(CvvImage& image, int desired_color = -1);virtual void CopyOf(IplImage* img, int desired_color = -1);IplImage* GetImage() { return m_img; };virtual void Destroy(void);/* width and height of ROI */int Width() { return !m_img ? 0 : !m_img->roi ? m_img->width : m_img->roi->width; };int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : m_img->roi->height; };int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : 0; };virtual void Fill(int color);/* draw to highgui window */virtual void Show(const char* window);#if defined WIN32 || defined _WIN32/* draw part of image to the specified DC */virtual void Show(HDC dc, int x, int y, int width, int height,int from_x = 0, int from_y = 0);/* draw the current image ROI to the specified rectangle of the destination DC */virtual void DrawToHDC(HDC hDCDst, RECT* pDstRect);#endifprotected:IplImage* m_img;};typedef CvvImage CImage;#endif
CvvImage.cpp
#include "StdAfx.h"#include "CvvImage.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CV_INLINE RECT NormalizeRect(RECT r);CV_INLINE RECT NormalizeRect(RECT r){int t;if (r.left > r.right){t = r.left;r.left = r.right;r.right = t;}if (r.top > r.bottom){t = r.top;r.top = r.bottom;r.bottom = t;}return r;}CV_INLINE CvRect RectToCvRect(RECT sr);CV_INLINE CvRect RectToCvRect(RECT sr){sr = NormalizeRect(sr);return cvRect(sr.left, sr.top, sr.right - sr.left, sr.bottom - sr.top);}CV_INLINE RECT CvRectToRect(CvRect sr);CV_INLINE RECT CvRectToRect(CvRect sr){RECT dr;dr.left = sr.x;dr.top = sr.y;dr.right = sr.x + sr.width;dr.bottom = sr.y + sr.height;return dr;}CV_INLINE IplROI RectToROI(RECT r);CV_INLINE IplROI RectToROI(RECT r){IplROI roi;r = NormalizeRect(r);roi.xOffset = r.left;roi.yOffset = r.top;roi.width = r.right - r.left;roi.height = r.bottom - r.top;roi.coi = 0;return roi;}void FillBitmapInfo(BITMAPINFO* bmi, int width, int height, int bpp, int origin){assert(bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);memset(bmih, 0, sizeof(*bmih));bmih->biSize = sizeof(BITMAPINFOHEADER);bmih->biWidth = width;bmih->biHeight = origin ? abs(height) : -abs(height);bmih->biPlanes = 1;bmih->biBitCount = (unsigned short)bpp;bmih->biCompression = BI_RGB;if (bpp == 8){RGBQUAD* palette = bmi->bmiColors;int i;for (i = 0; i < 256; i++){palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;palette[i].rgbReserved = 0;}}}CvvImage::CvvImage(){m_img = 0;}void CvvImage::Destroy(){cvReleaseImage(&m_img);}CvvImage::~CvvImage(){Destroy();}bool CvvImage::Create(int w, int h, int bpp, int origin){const unsigned max_img_size = 10000;if ((bpp != 8 && bpp != 24 && bpp != 32) ||(unsigned)w >= max_img_size || (unsigned)h >= max_img_size ||(origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL)){assert(0); // most probably, it is a programming errorreturn false;}if (!m_img || Bpp() != bpp || m_img->width != w || m_img->height != h){if (m_img && m_img->nSize == sizeof(IplImage))Destroy();/* prepare IPL header */m_img = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, bpp / 8);}if (m_img)m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL;return m_img != 0;}void CvvImage::CopyOf(CvvImage& image, int desired_color){IplImage* img = image.GetImage();if (img){CopyOf(img, desired_color);}}#define HG_IS_IMAGE(img) \((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && \((IplImage*)img)->imageData != 0)void CvvImage::CopyOf(IplImage* img, int desired_color){if (HG_IS_IMAGE(img)){int color = desired_color;CvSize size = cvGetSize(img);if (color < 0)color = img->nChannels > 1;if (Create(size.width, size.height,(!color ? 1 : img->nChannels > 1 ? img->nChannels : 3) * 8,img->origin)){cvConvertImage(img, m_img, 0);}}}bool CvvImage::Load(const char* filename, int desired_color){IplImage* img = cvLoadImage(filename, desired_color);if (!img)return false;CopyOf(img, desired_color);cvReleaseImage(&img);return true;}bool CvvImage::LoadRect(const char* filename,int desired_color, CvRect r){if (r.width < 0 || r.height < 0) return false;IplImage* img = cvLoadImage(filename, desired_color);if (!img)return false;if (r.width == 0 || r.height == 0){r.width = img->width;r.height = img->height;r.x = r.y = 0;}if (r.x > img->width || r.y > img->height ||r.x + r.width < 0 || r.y + r.height < 0){cvReleaseImage(&img);return false;}/* truncate r to source image */if (r.x < 0){r.width += r.x;r.x = 0;}if (r.y < 0){r.height += r.y;r.y = 0;}if (r.x + r.width > img->width)r.width = img->width - r.x;if (r.y + r.height > img->height)r.height = img->height - r.y;cvSetImageROI(img, r);CopyOf(img, desired_color);cvReleaseImage(&img);return true;}bool CvvImage::Save(const char* filename){if (!m_img)return false;cvSaveImage(filename, m_img);return true;}void CvvImage::Show(const char* window){if (m_img)cvShowImage(window, m_img);}void CvvImage::Show(HDC dc, int x, int y, int w, int h, int from_x, int from_y){if (m_img && m_img->depth == IPL_DEPTH_8U){uchar buffer[sizeof(BITMAPINFOHEADER)+1024];BITMAPINFO* bmi = (BITMAPINFO*)buffer;int bmp_w = m_img->width, bmp_h = m_img->height;FillBitmapInfo(bmi, bmp_w, bmp_h, Bpp(), m_img->origin);from_x = MIN(MAX(from_x, 0), bmp_w - 1);from_y = MIN(MAX(from_y, 0), bmp_h - 1);int sw = MAX(MIN(bmp_w - from_x, w), 0);int sh = MAX(MIN(bmp_h - from_y, h), 0);SetDIBitsToDevice(dc, x, y, sw, sh, from_x, from_y, from_y, sh,m_img->imageData + from_y*m_img->widthStep,bmi, DIB_RGB_COLORS);}}void CvvImage::DrawToHDC(HDC hDCDst, RECT* pDstRect){if (pDstRect && m_img && m_img->depth == IPL_DEPTH_8U && m_img->imageData){uchar buffer[sizeof(BITMAPINFOHEADER)+1024];BITMAPINFO* bmi = (BITMAPINFO*)buffer;int bmp_w = m_img->width, bmp_h = m_img->height;CvRect roi = cvGetImageROI(m_img);CvRect dst = RectToCvRect(*pDstRect);if (roi.width == dst.width && roi.height == dst.height){Show(hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y);return;}if (roi.width > dst.width){SetStretchBltMode(hDCDst, // handle to device contextHALFTONE);}else{SetStretchBltMode(hDCDst, // handle to device contextCOLORONCOLOR);}FillBitmapInfo(bmi, bmp_w, bmp_h, Bpp(), m_img->origin);::StretchDIBits(hDCDst,dst.x, dst.y, dst.width, dst.height,roi.x, roi.y, roi.width, roi.height,m_img->imageData, bmi, DIB_RGB_COLORS, SRCCOPY);}}void CvvImage::Fill(int color){cvSet(m_img, cvScalar(color & 255, (color >> 8) & 255, (color >> 16) & 255, (color >> 24) & 255));}
第四个、opencv的头文件报错可能,下面是一个我的万能opencv头文件,为了方便使用,都是一些经常会用到的文件:
#ifndef _PREDEP_H_ #define _PREDEP_H_ #pragma once #include <stdio.h> #include <tchar.h> #include <iostream> #include<fstream>#include "opencv2/core/version.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include"opencv2/contrib/contrib.hpp"#define CV_VERSION_ID CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION) #ifdef _DEBUG #define cvLIB(name) "opencv_" name CV_VERSION_ID "d" #else #define cvLIB(name) "opencv_" name CV_VERSION_ID #endif #pragma comment( lib, cvLIB("core") ) #pragma comment( lib, cvLIB("imgproc") ) #pragma comment( lib, cvLIB("highgui") ) #pragma comment( lib, cvLIB("flann") ) #pragma comment( lib, cvLIB("features2d") ) #pragma comment( lib, cvLIB("calib3d") ) #endif
如果你加了这个头文件还是会报错,可以直接加在DIALOG的cpp文件的头那边,
#include "stdafx.h"#include "MFC_img.h"#include "MFC_imgDlg.h"#include "afxdialogex.h"#include "CvvImage.h"#include <stdio.h> #include <tchar.h> #include <iostream> #include<fstream>#include "opencv2/core/version.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include"opencv2/contrib/contrib.hpp"如还有什么错误,可以留言。
- vs2013+Opencv2.4.9+MFC的图像浏览窗口
- VS2013 MFC 直接将 OpenCV2.0/3.0 库中的 Mat 结构的图像传递到 Picture Control(图片控件)
- 基于VS2013+Qt5.7+OpenCV2.3.0的移动图像监测
- VS2013基于MFC的CMD调试窗口
- vs2013 opencv2.4.9 中出现的问题
- vs2013配置opencv2.4.9
- VS2013+OpenCV2.4.9配置
- vs2013配置opencv2.4.9
- vs2013配置opencv2.4.9
- opencv2.4.9 +VS2013
- OpenCV2.4.9+VS2013配置
- opencv2.4.9+VS2013环境搭建
- VS2013 + OpenCV2.4.9 配置过程
- opencv2.4.9 在vs2013 上的配置方法
- 在VS2013下的openCV2.4.9安装过程
- (1)OpenCV2.4.9在VS2013的环境配置
- opencv2.4.9+VS2013中imread和cvLoadimage的使用区别
- OpenCv2(图像的遍历)
- 协议 Protocol 的使用
- javascript 将xml字符串转换成json对象
- PHP 使用telent测试HTTP
- Linux Is Not Matrix——Nginx安装
- easyui中ajax笔记
- vs2013+Opencv2.4.9+MFC的图像浏览窗口
- cin>>i的返回值的问题 & cin输入流
- ComboBox 强制转换为大写的方法
- 主键ID、时间转化工具类
- 图片加载与缓存利器(自动缓存)--第三方开源-- Glide
- DataGridView 索引,添加列
- 读书笔记--Intent
- python 网络爬虫(一):世界上最简单的Web浏览器
- JAVA同步容器使用心得