source: foam/trunk/simple-faceident/src/ImageUtils.cpp @ 72

Revision 72, 4.3 KB checked in by dave, 12 years ago (diff)

added experimental computer vision code

Line 
1// Copyright (C) 2009 foam
2//
3// This program is free software; you can redistribute it and/or modify
4// it under the terms of the GNU General Public License as published by
5// the Free Software Foundation; either version 2 of the License, or
6// (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11// GNU General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with this program; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
17#include "ImageUtils.h"
18
19#include <iostream>
20using namespace std;
21
22/////////////////////////////////////////////////////////////
23// deep copy a sub image
24
25IplImage* SubImage(IplImage *image, CvRect roi)
26{
27        IplImage *result;
28        cvSetImageROI(image,roi);
29        result = cvCreateImage( cvSize(roi.width, roi.height), image->depth, image->nChannels );
30        cvCopy(image,result);
31        cvResetImageROI(image);
32        return result;
33}
34
35/////////////////////////////////////////////////////////////
36// paste an image over the top of another
37
38void BlitImage(IplImage *srcimage, IplImage *dstimage, CvPoint pos)
39{
40        CvSize size = cvGetSize(srcimage);
41        CvSize dstsize = cvGetSize(dstimage);
42       
43        for(int y=0; y<size.height; y++)
44        {
45        for(int x=0; x<size.width; x++)
46                {
47                        if (x+pos.x>0 && x+pos.x<dstsize.width &&
48                                y+pos.y>0 && y+pos.y<dstsize.height)
49                        {
50                cvSet2D(dstimage,y+pos.y,x+pos.x,cvGet2D(srcimage,y,x));
51                        }
52                }
53        }
54}
55
56/////////////////////////////////////////////////////////////
57// subtract the mean (RGB)
58
59void SubMean(IplImage *image)
60{
61        CvSize size = cvGetSize(image);
62
63        float r=0;
64        float g=0;
65        float b=0;
66
67        float s=size.width*size.height;
68
69    for(int y=0; y<size.height; y++)
70        {
71        for(int x=0; x<size.width; x++)
72                {
73            r+=cvGet2D(image,y,x).val[0]/256.0f;
74            g+=cvGet2D(image,y,x).val[1]/256.0f;
75            b+=cvGet2D(image,y,x).val[2]/256.0f;
76                }
77        }
78       
79        r/=s;
80        g/=s;
81        b/=s;
82               
83        for(int y=0; y<size.height; y++)
84        {
85        for(int x=0; x<size.width; x++)
86                {
87            cvSet2D(image,y,x,cvScalar(127+(cvGet2D(image,y,x).val[0] - r*256.0f),
88                                                                           127+(cvGet2D(image,y,x).val[1] - g*256.0f),
89                                                                           127+(cvGet2D(image,y,x).val[2] - b*256.0f)));
90                }
91        }
92}
93
94/////////////////////////////////////////////////////////////
95// return a diff metric between two images (works in RGB)
96
97float Diff(IplImage *imagea, IplImage *imageb)
98{
99        CvSize sizea = cvGetSize(imagea);
100        CvSize sizeb = cvGetSize(imageb);
101       
102        assert(sizea.width == sizeb.width);
103        assert(sizea.height == sizeb.height);
104       
105        float ret=0;
106
107    for(int y=0; y<sizea.height; y++)
108        {
109        for(int x=0; x<sizea.width; x++)
110                {
111            ret+=fabs((cvGet2D(imagea,y,x).val[0]/256.0f)-(cvGet2D(imageb,y,x).val[0]/256.0f));
112            ret+=fabs((cvGet2D(imagea,y,x).val[1]/256.0f)-(cvGet2D(imageb,y,x).val[1]/256.0f));
113            ret+=fabs((cvGet2D(imagea,y,x).val[2]/256.0f)-(cvGet2D(imageb,y,x).val[2]/256.0f));
114                }
115        }
116        ret/=sizea.width*sizea.height*3;
117        return ret;
118}
119
120
121
122/////////////////////////////////////////////////////////////
123// return a local binary patterns image of the src image
124
125unsigned char SafeGet2D(IplImage *image, int y, int x, int c)
126{
127        CvSize size = cvGetSize(image);
128        if (x<0 || x>=size.width || y<0 || y>=size.height)
129        {
130                return 0;
131        }
132       
133        return cvGet2D(image,y,x).val[c];
134}
135
136void LBPImage(IplImage *srcimage, IplImage *dstimage)
137{
138        CvSize srcsize = cvGetSize(srcimage);
139        CvSize dstsize = cvGetSize(dstimage);
140       
141        assert(srcsize.width == dstsize.width);
142        assert(srcsize.height == dstsize.height);
143        assert(srcimage->nChannels == dstimage->nChannels);
144
145    for(int y=0; y<srcsize.height; y++)
146        {
147        for(int x=0; x<srcsize.width; x++)
148                {
149                        CvScalar sc;
150
151                        for(int c=0; c<dstimage->nChannels; c++)
152                        {
153                                unsigned char v=0;
154                                unsigned char o=cvGet2D(srcimage,y,x).val[c];
155                                unsigned char b=0;
156                                for (int kx=-1; kx<=1; kx++)
157                                {
158                                        for (int ky=-1; ky<=1; ky++)
159                                        {
160                                                // don't compare with ourself
161                                                if (!(kx==0 && ky==0))
162                                                {
163                                                        if (o>SafeGet2D(srcimage,y+ky,x+kx,c))
164                                                        {
165                                                                v&=1<<b;
166                                                        }
167                                                        b++;
168                                                }
169                                        }
170                                }
171                                sc.val[c]=v;
172                        }
173                        cvSet2D(dstimage,y,x,sc);
174                }
175        }
176}
Note: See TracBrowser for help on using the repository browser.