text: 
  #ifndef FRIENDFUNCTIONS_H
  #define FRIENDFUNCTIONS_H
  
  #include "stdafx.h"
  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
  #include <vector>
  //#include <atlstr.h>
  #include "opencv2/opencv.hpp"
  
  
  using namespace std;
  typedef unsigned char uchar;
  #define p3f(Y,r,c,chan) (float)(((uchar*)(Y->imageData + Y->widthStep*(r)))[(c)*3+(chan)])
  #define p3(Y,r,c,chan) (((uchar*)(Y->imageData + Y->widthStep*(r)))[(c)*3+(chan)])
  #define pM(Y,r,c) ((double*)(Y->data.ptr+ Y->step*r))[c]
  
  uchar* Ipl2uchar(IplImage* img)
  {
  	uchar* tempIm = new uchar[3*img->height*img->width];
  	for(int i=0;i<img->height;i++)
  		for(int j=0;j<img->width;j++)
  			for(int k=0;k<3;k++)
  				tempIm[3*(i*img->width+j)+k] = p3(img,i,j,k);
  
  	return tempIm;
  }
  void Ipl2uchar_Nomem(IplImage* img,uchar *target)
  {
  	for(int i=0;i<img->height;i++)
  		for(int j=0;j<img->width;j++)
  			for(int k=0;k<3;k++)
  				target[3*(i*img->width+j)+k] = p3(img,i,j,k);
  
  }
  void Mat2uchar_Nomem(cv::Mat* img,uchar *target)
  {
          for(int i=0;i<img->rows;i++)
  		for(int j=0;j<img->cols;j++)
  			for(int k=0;k<3;k++)
  				target[3*(i*img->cols+j)+k] = img->at<cv::Vec3b>(i, j)[k];
  }
  void uchar2Ipl(uchar *tempIm,IplImage* img)
  {
  	for(int i=0;i<img->height;i++)
  		for(int j=0;j<img->width;j++)
  			for(int k=0;k<3;k++)
  				 p3(img,i,j,k) = tempIm[3*(i*img->width+j)+k];
  }
  void uchar2Mat(uchar *tempIm,cv::Mat* img)
  {
          for(int i=0;i<img->rows;i++)
  		for(int j=0;j<img->cols;j++)
                          img->at<int>(i, j) = tempIm[3*(i*img->cols+j)+0] 
                                  + 256*tempIm[3*(i*img->cols+j)+1] + 256*256*tempIm[3*(i*img->cols+j)+2];
  }
  void int2Mat(int *tempIm,cv::Mat* img)
  {
          for(int i=0;i<img->rows;i++)
  		for(int j=0;j<img->cols;j++)
                          img->at<int>(i, j) = tempIm[i*img->cols+j];
  }
  #endif