嘿嘿,我也是菜鸟一只。OpenCV也是今天第一次听一位同学说的,最近公司让我搞一个可视对讲的东西所以对视频类的东西稍有兴趣,纯属好奇心太强啊。初次使用就简单做一下笔录也算是如实交代吧。OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。我看OpenCV-2.4.7版本人家在android上面也能用,接下来我也去尝试一回。既然是MFC那么你就要有开发工具了,现在大概用vs系列的多一些吧,VC6.0就不说了。有了工具之后咱就得有OpenCV,OpenCV的使用就得经历以下步骤了:
一、下载OpenCV,下载地址为http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.7/OpenCV-2.4.7.exe/download
二、下载完成之后运行,实际上它就开始自解压了。
三、为OpenCV配置环境变量,经常配过的人有经验就是配置bin文件夹,C:opencvbuildx86vc10bin(在刚才解压的目录找到你自己对应的平台)这个我就不说了吧。
四、在vs中配置,新建一个mfc项目。
(1)打开VS菜单栏—>视图—>属性管理器,双击Micrsof.CPP.Win32.user.
(2)在属性页—>通用属性—>VC++目录—>包含目录下加入:
C:Program Filesopencv2.4.7buildinclude;
C:Program Filesopencv2.4.7buildincludeopencv;
C:Program Filesopencv2.4.7buildincludeopencv2;
(3)在属性页—>通用属性—>VC++目录—>库目录下加入C:opencvbuildx86vc10lib(看对你自己的目录)。
(4)在属性页->链接器->输入->附加依赖项 里面加入
opencv_calib3d247d.lib
opencv_contrib247d.lib
opencv_core247d.lib
opencv_features2d247d.lib
opencv_flann247d.lib
opencv_gpu247d.lib
opencv_highgui247d.lib
opencv_imgproc247d.lib
opencv_legacy247d.lib
opencv_ml247d.lib
opencv_objdetect247d.lib
opencv_ts247d.lib
opencv_video247d.lib
然后应用确定,配置到此算是完成了。
在头文件中新建CvvImage.h代码为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#pragma once #ifndef CVVIMAGE_CLASS_DEF #define CVVIMAGE_CLASS_DEF #include<opencv2opencv.hpp> /* CvvImage class definition */ class CvvImage { public: CvvImage(); virtual ~CvvImage(); virtual bool Create( int width, int height, int bits_per_pixel, int image_origin = 0 ); virtual bool Load( const char* filename, int desired_color = 1 ); virtual bool LoadRect( const char* filename, int desired_color, CvRect r ); #if defined WIN32 || defined _WIN32 virtual 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 virtual bool Save( const char* filename ); 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); 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 ); virtual void Show( const char* window ); #if defined WIN32 || defined _WIN32 virtual void Show( HDC dc, int x, int y, int width, int height, int from_x = 0, int from_y = 0 ); virtual void DrawToHDC( HDC hDCDst, RECT* pDstRect ); #endif protected: IplImage* m_img; }; typedef CvvImage CImage; #endif
CvvImage.h的实现为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261#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 error return 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 context HALFTONE ); } else { SetStretchBltMode( hDCDst, // handle to device context COLORONCOLOR ); } 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) ); }
在窗体cpp文件中添加引用
1
2#include"CvvImage.h" #include<opencv2opencv.hpp>
申明全局变量
1
2
3
4
5CvCapture* capture; CRect rect; CDC *pDC; HDC hDC; CWnd *pwnd;
在OnInitDialog()方法中的// TODO: 在此添加额外的初始化代码后添加代码
1
2
3
4pwnd = GetDlgItem(IDC_STATIC); pDC =pwnd->GetDC(); hDC= pDC->GetSafeHdc(); pwnd->GetClientRect(&rect);
双击打开按钮添加以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20if(!capture) { capture = cvCaptureFromCAM(0); } if (!capture) { AfxMessageBox("无法打开摄像头"); return; } IplImage* m_Frame; m_Frame=cvQueryFrame(capture); CvvImage m_CvvImage; m_CvvImage.CopyOf(m_Frame,1); if (true) { m_CvvImage.DrawToHDC(hDC, &rect); } // 设置计时器,每10ms触发一次事件 SetTimer(1,10,NULL);
双击关闭按钮添加以下代码
1cvReleaseCapture(&capture);
右键主窗体选择类向导
搜索信息WM_TIMER双击之后会在函数名称中出现OnTimer然后编辑代码,添加以下代码
1
2
3
4
5
6
7
8
9IplImage* m_Frame; m_Frame=cvQueryFrame(capture); CvvImage m_CvvImage; m_CvvImage.CopyOf(m_Frame,1); if (true) { m_CvvImage.DrawToHDC(hDC, &rect); } CDialogEx::OnTimer(nIDEvent);
到此完成本次测试。我加了一个抓拍的功能但是有点儿小问题,我会在下篇中继续完善
运行效果为以下
项目源码可以在这里下载。http://download.csdn.net/detail/liu1164316159/6715757
最后
以上就是高贵泥猴桃最近收集整理的关于mfc结合OpenCV-2.4.7 初次尝试纯属好奇(OpenCV安装并在vs2010中配置)的全部内容,更多相关mfc结合OpenCV-2.4.7内容请搜索靠谱客的其他文章。
发表评论 取消回复