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"
如还有什么错误,可以留言。


0 0
原创粉丝点击