[openrtm-commit:01128] r98 - in branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple: include/BackGroundSubtractionSimple src

openrtm @ openrtm.org openrtm @ openrtm.org
2013年 9月 26日 (木) 13:39:49 JST


Author: kawauchi
Date: 2013-09-26 13:39:49 +0900 (Thu, 26 Sep 2013)
New Revision: 98

Modified:
   branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/include/BackGroundSubtractionSimple/BackGroundSubtractionSimple.h
   branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/src/BackGroundSubtractionSimple.cpp
Log:
BackGroundSubtractionSimple component has been changed to use member function from a static function usage. refs #2704

Modified: branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/include/BackGroundSubtractionSimple/BackGroundSubtractionSimple.h
===================================================================
--- branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/include/BackGroundSubtractionSimple/BackGroundSubtractionSimple.h	2013-09-09 06:21:46 UTC (rev 97)
+++ branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/include/BackGroundSubtractionSimple/BackGroundSubtractionSimple.h	2013-09-26 04:39:49 UTC (rev 98)
@@ -23,19 +23,17 @@
 #include <cxcore.h>
 #include <highgui.h>
 
-#define	THRESHOLD			20				//	·•ª‚ð‹‚ß‚éÛ‚Ì臒l
-#define THRESHOLD_MAX_VALUE	255				//	2’l‰»‚̍ۂɎg—p‚·‚éÅ‘å’l
-#define	SCALE				( 1.0 / 255.0 )	//	L*a*b*‚É•ÏŠ·‚·‚邽‚ß‚É•K—v‚ȃXƒP[ƒ‹ƒtƒ@ƒNƒ^
+#define THRESHOLD_MAX_VALUE	255				//	2値化の際に使用する最大値
+#define	SCALE				( 1.0 / 255.0 )	//	L*a*b*に変換するために必要なスケールファクタ
 
-#define CAPTURE_OFF			0	//	‰æ‘œ‚̃Lƒƒƒvƒ`ƒƒ‚𒆎~‚·‚éƒtƒ‰ƒO’l
-#define CAPTURE_ON			1	//	‰æ‘œ‚̃Lƒƒƒvƒ`ƒƒ‚ðŠJŽn‚·‚éƒtƒ‰ƒO’l
-#define COLOR_DIFFERENCE	0	//	RGBŠe¬•ª‚É‚¨‚¯‚鍷•ªŽZo‚̃tƒ‰ƒO’l
-#define LAB_DIFFERENCE		1	//	L*a*b*•\FŒn‚É‚¨‚¯‚鍷•ªŽZo‚̃tƒ‰ƒO’l
-#define GRAY_DIFFERENCE		2	//	ƒOƒŒ[ƒXƒP[ƒ‹‚É‚¨‚¯‚鍷•ªŽZo‚̃tƒ‰ƒO’l
-#define NOISE_KEEP			0	//	ƒmƒCƒY‚ðœ‹Ž‚µ‚È‚¢ƒtƒ‰ƒO’l
-#define	NOISE_MORPHOLOGY	1	//	ƒ‚ƒ‹ƒtƒHƒƒW[‰‰ŽZ‚É‚æ‚éƒmƒCƒYœ‹Ž‚̃tƒ‰ƒO’l
-#define NOISE_MEDIAN		2	//	ƒƒfƒBƒAƒ“ƒtƒBƒ‹ƒ^‚É‚æ‚éƒmƒCƒYœ‹Ž‚̃tƒ‰ƒO’l
+#define COLOR_DIFFERENCE	0	//	RGB各成分における差分算出のフラグ値
+#define LAB_DIFFERENCE		1	//	L*a*b*表色系における差分算出のフラグ値
+#define GRAY_DIFFERENCE		2	//	グレースケールにおける差分算出のフラグ値
+#define NOISE_KEEP			0	//	ノイズを除去しないフラグ値
+#define	NOISE_MORPHOLOGY	1	//	モルフォロジー演算によるノイズ除去のフラグ値
+#define NOISE_MEDIAN		2	//	メディアンフィルタによるノイズ除去のフラグ値
 
+
 // Service implementation headers
 // <rtc-template block="service_impl_h">
 
@@ -243,21 +241,27 @@
   /*!
    * 
    * - Name:  cont_mode
-   * - DefaultValue: a
+   * - DefaultValue: b
    */
   char m_cont_mode;
-  /*!
+    /*!
    * 
-   * - Name:  img_height
-   * - DefaultValue: 240
+   * - Name:  diff_mode
+   * - DefaultValue: b
    */
-  int m_img_height;
+  char m_diff_mode;
+    /*!
+   * 
+   * - Name:  noise_mode
+   * - DefaultValue: b
+   */
+  char m_noise_mode;
   /*!
    * 
-   * - Name:  img_width
-   * - DefaultValue: 320
+   * - Name:  nThresholdLv
+   * - DefaultValue: 20
    */
-  int m_img_width;
+  int m_nThresholdLv;
 
   // </rtc-template>
 
@@ -315,7 +319,21 @@
   // <rtc-template block="private_operation">
   
   // </rtc-template>
+	void colorDifference( void );
+	void labDifference( void );
+	void grayScaleDifference( void );
 
+	IplImage *m_originalImage;
+	IplImage *m_currentImage;
+	IplImage *m_backgroundImage;
+	IplImage *m_resultImage;
+	IplImage *m_outputImage;
+	
+	int	m_differenceMode;		//	差分の計算モード
+	int	m_noiseMode;				//	ノイズを除去するモード
+	int m_temp_w;
+	int m_temp_h;
+
 };
 
 

Modified: branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/src/BackGroundSubtractionSimple.cpp
===================================================================
--- branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/src/BackGroundSubtractionSimple.cpp	2013-09-09 06:21:46 UTC (rev 97)
+++ branches/newCMakeForVC2010/ImageProcessing/opencv/components/BackGroundSubtractionSimple/src/BackGroundSubtractionSimple.cpp	2013-09-26 04:39:49 UTC (rev 98)
@@ -26,41 +26,27 @@
     "lang_type",         "compile",
     // Configuration variables
     "conf.default.control_mode", "b",
-    "conf.default.image_height", "240",
-    "conf.default.image_width", "320",
+    "conf.default.diff_mode", "0",
+    "conf.default.noise_mode", "0",
+    "conf.default.threshold_level", "20",
     // Widget
     "conf.__widget__.control_mode", "radio",
-    "conf.__widget__.image_height", "text",
-    "conf.__widget__.image_width", "text",
+    "conf.__widget__.diff_mode", "radio",
+    "conf.__widget__.noise_mode", "radio",
+    "conf.__widget__.threshold_level", "slider.1",
     // Constraints
-    "conf.__constraints__.control_mode", "(b,m,n)",
+    "conf.__constraints__.control_mode", "(b,M)",
+    "conf.__constraints__.diff_mode", "(0,1,2)",
+    "conf.__constraints__.noise_mode", "(0,1,2)",
+    "conf.__constraints__.threshold_level", "0<=x<=255",
     ""
   };
 // </rtc-template>
 
-//char windowNameCurrent[] = "Current";		//	Œ»Ý‚̉摜‚ð•\Ž¦‚·‚éƒEƒBƒ“ƒhƒE‚Ì–¼‘O
-//char windowNameResult[] = "Result";			//	”wŒi·•ªŒ‹‰Ê‚ð•\Ž¦‚·‚éƒEƒBƒ“ƒhƒE‚Ì–¼‘O
-//char windowNameBackground[] = "Background";	//	”wŒi‰æ‘œ‚ð•\Ž¦‚·‚éƒEƒBƒ“ƒhƒE‚Ì–¼‘O
-
-int	captureOn = CAPTURE_ON;				//	”wŒi·•ª‚ðs‚¤‰æ‘œ‚ðXV‚·‚é‚©‚Ç‚¤‚©
-int	differenceMode = COLOR_DIFFERENCE;	//	·•ª‚ÌŒvŽZƒ‚[ƒh
-int	noiseMode = NOISE_KEEP;				//	ƒmƒCƒY‚ðœ‹Ž‚·‚郂[ƒh
-
-int g_temp_w = 0;
-int g_temp_h = 0;
-
-
-IplImage *originalImage = NULL;
-IplImage *currentImage = NULL;
-IplImage *backgroundImage = NULL;
-IplImage *resultImage = NULL;
-IplImage *outputImage = NULL;
-
-//char *differenceMethod[3] = {
 std::string differenceMethod[3] = {
-	"Evaluate each component of RGB",  //RGB‚̐¬•ª‚²‚Æ‚É•]‰¿
-	"Evaluate the distance in CIE L * a * b *",  //CIE L*a*b* ‚Å‹——£‚ð•]‰¿
-	"Evaluated by gray scale"  //ƒOƒŒ[ƒXƒP[ƒ‹‚Å•]‰¿
+	"RGB",          //RGBの成分ごとに評価
+	"CIE L*a*b*",   //CIE L*a*b* で距離を評価
+	"gray scale"    //グレースケールで評価
 };
 
 std::string noiseMethod[3] = {
@@ -69,110 +55,6 @@
 	"Median filter"
 };
 
-void colorDifference( IplImage *currentImage, IplImage *backgroundImage, IplImage *resultImage ){
-	
-	//	‰æ‘œ‚𐶐¬‚·‚é
-	IplImage *differenceImage = cvCreateImage(cvSize(currentImage->width, currentImage->height), IPL_DEPTH_8U, 3);	//	·•ª‰æ‘œ—pIplImage
-	IplImage *differenceRImage = cvCreateImage(cvSize(currentImage->width, currentImage->height), IPL_DEPTH_8U, 1);	//	R’l‚̍·•ª—pIplImage
-	IplImage *differenceGImage = cvCreateImage(cvSize(currentImage->width, currentImage->height), IPL_DEPTH_8U, 1);	//	G’l‚̍·•ª—pIplImage
-	IplImage *differenceBImage = cvCreateImage(cvSize(currentImage->width, currentImage->height), IPL_DEPTH_8U, 1);	//	B’l‚̍·•ª—pIplImage
-
-	//	Œ»Ý‚Ì”wŒi‚Ƃ̍·‚̐â‘Î’l‚𐬕ª‚²‚Æ‚ÉŽæ‚é
-	cvAbsDiff( currentImage, backgroundImage, differenceImage );
-
-	//	臒lˆ—‚ðs‚¤
-	cvThreshold( differenceImage, differenceImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
-
-	//	¬•ª‚²‚Ƃ̉摜‚É•ªŠ„‚·‚é
-	cvSplit( differenceImage, differenceBImage, differenceGImage, differenceRImage, NULL );
-
-	//	OR‚ō‡¬‚·‚é
-	cvOr( differenceRImage, differenceGImage, resultImage );
-	cvOr( differenceBImage, resultImage, resultImage );
-
-	//	ƒƒ‚ƒŠ‚ð‰ð•ú‚·‚é
-	cvReleaseImage( &differenceImage );
-	cvReleaseImage( &differenceRImage );
-	cvReleaseImage( &differenceGImage );
-	cvReleaseImage( &differenceBImage );
-
-}
-
-//
-//	L*a*b*‚Å‹——£‚ð•]‰¿‚·‚é
-//
-//	ˆø”:
-//		currentImage    : Œ»Ý‚̉摜—pIplImage
-//		backgroundImage : ”wŒi‰æ‘œ—pIplImage
-//		resultImage     : Œ‹‰Ê‰æ‘œ—pIplImage
-//
-void labDifference( IplImage *currentImage, IplImage *backgroundImage, IplImage *resultImage ){
-
-	//	‰æ‘œ‚𐶐¬‚·‚é
-	IplImage *currentLabImage = cvCreateImage( cvSize(currentImage->width, currentImage->height),IPL_DEPTH_32F, 3 );		//	Œ»Ý‚̉摜‚ðL*a*b*‚É•ÏŠ·‚µ‚½‰æ‘œ—pIplImage
-	IplImage *backgroundLabImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 3 );	//	”wŒi‚ðL*a*b*‚É•ÏŠ·‚µ‚½‰æ‘œ—pIplImage
-	IplImage *differenceLabImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 3 );	//	·•ª‰æ‘œ—pIplImage
-	IplImage *differenceLImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 1 );		//	L*’l‚̍·•ª—pIplImage
-	IplImage *differenceAImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 1 );		//	a*’l‚̍·•ª—pIplImage
-	IplImage *differenceBImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 1 );		//	b*’l‚̍·•ª—pIplImage
-	IplImage *sqrDifferenceImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_32F, 1 );	//	‹——£ŽZo—pIplImage
-
-	//	Œ»Ý‚̉摜‚Æ”wŒi‚ð‹¤‚É CIE L*a*b* ‚É•ÏŠ·
-	cvConvertScale( currentImage, currentLabImage, SCALE );
-	cvConvertScale( backgroundImage, backgroundLabImage, SCALE );
-	cvCvtColor( currentLabImage, currentLabImage, CV_BGR2Lab );
-	cvCvtColor( backgroundLabImage, backgroundLabImage, CV_BGR2Lab );
-
-	//	‹——£‚Ì“ñæ‚ðŒvŽZ‚·‚é
-	cvSub( currentLabImage, backgroundLabImage, differenceLabImage );
-	cvPow( differenceLabImage, differenceLabImage, 2 );
-
-	//	¬•ª‚²‚Ƃ̉摜‚É•ªŠ„‚·‚é
-	cvSplit( differenceLabImage, differenceLImage, differenceAImage, differenceBImage, NULL );
-
-	cvCopy( differenceLImage, sqrDifferenceImage );
-	cvAdd( differenceAImage, sqrDifferenceImage, sqrDifferenceImage );
-	cvAdd( differenceBImage, sqrDifferenceImage, sqrDifferenceImage );
-
-	//	臒lˆ—‚ðs‚¤
-	cvThreshold( sqrDifferenceImage, resultImage, THRESHOLD * THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
-
-	//	ƒƒ‚ƒŠ‚ð‰ð•ú‚·‚é
-	cvReleaseImage( &currentLabImage );
-	cvReleaseImage( &backgroundLabImage );
-	cvReleaseImage( &differenceLabImage );
-	cvReleaseImage( &differenceLImage );
-	cvReleaseImage( &differenceAImage );
-	cvReleaseImage( &differenceBImage );
-	cvReleaseImage( &sqrDifferenceImage );
-}
-
-//
-//	ƒOƒŒ[ƒXƒP[ƒ‹‚Å•]‰¿‚·‚é
-//
-//	ˆø”:
-//		currentImage    : Œ»Ý‚̉摜—pIplImage
-//		backgroundImage : ”wŒi‰æ‘œ—pIplImage
-//		resultImage     : Œ‹‰Ê‰æ‘œ—pIplImage
-//
-void grayScaleDifference( IplImage *currentImage, IplImage *backgroundImage, IplImage *resultImage ){
-
-	//	‰æ‘œ‚𐶐¬‚·‚é
-	IplImage *differenceImage = cvCreateImage( cvSize(currentImage->width, currentImage->height), IPL_DEPTH_8U, 3 );	//	·•ª‰æ‘œ—pIplImage
-
-	//	Œ»Ý‚Ì”wŒi‚Ƃ̍·‚̐â‘Î’l‚𐬕ª‚²‚Æ‚ÉŽæ‚é
-	cvAbsDiff( currentImage, backgroundImage, differenceImage );
-
-	//	BGR‚©‚çƒOƒŒ[ƒXƒP[ƒ‹‚É•ÏŠ·‚·‚é
-	cvCvtColor( differenceImage, resultImage, CV_BGR2GRAY );
-
-	//	ƒOƒŒ[ƒXƒP[ƒ‹‚©‚ç2’l‚É•ÏŠ·‚·‚é
-	cvThreshold( resultImage, resultImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
-
-	//	ƒƒ‚ƒŠ‚ð‰ð•ú‚·‚é
-	cvReleaseImage( &differenceImage );
-}
-
 /*!
  * @brief constructor
  * @param manager Maneger Object
@@ -222,10 +104,17 @@
 
   // <rtc-template block="bind_config">
   // Bind variables and configuration variable
-  bindParameter("control_mode", m_cont_mode, "a");
-  bindParameter("image_height", m_img_height, "240");
-  bindParameter("image_width", m_img_width, "320");
+  bindParameter("control_mode", m_cont_mode, "b");
+  bindParameter("diff_mode", m_diff_mode, "0");
+  bindParameter("noise_mode", m_noise_mode, "0");
+  bindParameter("threshold_level", m_nThresholdLv, "20");
   // </rtc-template>
+
+	m_originalImage = NULL;
+	m_currentImage = NULL;
+	m_backgroundImage = NULL;
+	m_resultImage = NULL;
+	m_outputImage = NULL;
   
   return RTC::RTC_OK;
 }
@@ -254,51 +143,40 @@
 
 RTC::ReturnCode_t BackGroundSubtractionSimple::onActivated(RTC::UniqueId ec_id)
 {	
-	captureOn = CAPTURE_ON;				//	”wŒi·•ª‚ðs‚¤‰æ‘œ‚ðXV‚·‚é‚©‚Ç‚¤‚©
-  differenceMode = COLOR_DIFFERENCE;	//	·•ª‚ÌŒvŽZƒ‚[ƒh
-	noiseMode = NOISE_KEEP;				//	ƒmƒCƒY‚ðœ‹Ž‚·‚郂[ƒh
+  m_differenceMode = COLOR_DIFFERENCE;	//	差分の計算モード
+	m_noiseMode = NOISE_KEEP;				      //	ノイズを除去するモード
 
-	g_temp_w = 0;
-	g_temp_h = 0;
+	m_temp_w = 0;
+	m_temp_h = 0;
 
-	if(originalImage != NULL){
-		cvReleaseImage(&originalImage);
-	}
-	if(currentImage != NULL){
-		cvReleaseImage(&currentImage);
-	}
-	if(resultImage != NULL){
-		cvReleaseImage(&resultImage);
-	}
-	if(outputImage != NULL){
-		cvReleaseImage(&outputImage);
-	}
-	if(backgroundImage != NULL){
-		cvReleaseImage(&backgroundImage);
-	}
-
 	return RTC::RTC_OK;
 }
 
 
 RTC::ReturnCode_t BackGroundSubtractionSimple::onDeactivated(RTC::UniqueId ec_id)
 {
-	if(originalImage != NULL){
-		cvReleaseImage(&originalImage);
+	if(m_originalImage != NULL){
+		cvReleaseImage(&m_originalImage);
 	}
-	if(currentImage != NULL){
-		cvReleaseImage(&currentImage);
+	if(m_currentImage != NULL){
+		cvReleaseImage(&m_currentImage);
 	}
-	if(resultImage != NULL){
-		cvReleaseImage(&resultImage);
+	if(m_resultImage != NULL){
+		cvReleaseImage(&m_resultImage);
 	}
-	if(outputImage != NULL){
-		cvReleaseImage(&outputImage);
+	if(m_outputImage != NULL){
+		cvReleaseImage(&m_outputImage);
 	}
-	if(backgroundImage != NULL){
-		cvReleaseImage(&backgroundImage);
+	if(m_backgroundImage != NULL){
+		cvReleaseImage(&m_backgroundImage);
 	}
 
+	m_originalImage = NULL;
+	m_currentImage = NULL;
+	m_backgroundImage = NULL;
+	m_resultImage = NULL;
+	m_outputImage = NULL;
+	
 	return RTC::RTC_OK;
 }
 
@@ -308,152 +186,126 @@
 	
 	if(m_img_origIn.isNew()) {
 		
-		//ƒCƒ[ƒWRead
+		//イメージRead
 		m_img_origIn.read();
 		
-		if(originalImage == NULL){
-			originalImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
+		if(m_originalImage == NULL){
+			m_originalImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
 		}
-		if(currentImage == NULL){
-			currentImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
+		if(m_currentImage == NULL){
+			m_currentImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
 		}
 
-		if(m_img_orig.width != g_temp_w || m_img_orig.height != g_temp_h){
+		if(m_img_orig.width != m_temp_w || m_img_orig.height != m_temp_h){
 			
-			if(backgroundImage != NULL){
-				cvReleaseImage(&backgroundImage);
+			if(m_backgroundImage != NULL){
+				cvReleaseImage(&m_backgroundImage);
 			}
-			backgroundImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
+			m_backgroundImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
 		}
 		
-		if(resultImage == NULL){
-			resultImage =  cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 1);
+		if(m_resultImage == NULL){
+			m_resultImage =  cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 1);
 		}
-		if(outputImage == NULL){
-			outputImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
+		if(m_outputImage == NULL){
+			m_outputImage = cvCreateImage(cvSize(m_img_orig.width, m_img_orig.height), IPL_DEPTH_8U, 3);
 		}
 
-		//	‰æ‘œ‚ð1–‡ƒLƒƒƒvƒ`ƒƒ‚µ”wŒi‚Æ‚µ‚Ä•Û‘¶‚·‚é
-		//backgroundImage = cvCloneImage( originalImage );
-
-		//	Œ»Ý‚̉摜‚Æ‚µ‚Ä‚à1–‡Šm•Û‚·‚é
-		//currentImage = cvCloneImage( originalImage );
-
-		//InPort‚̉f‘œ‚̎擾
-		memcpy(originalImage->imageData,(void *)&(m_img_orig.pixels[0]),m_img_orig.pixels.length());
-
-		if( captureOn != 0){
-			if( currentImage != NULL){
-				cvReleaseImage( &currentImage );
-			}
-			currentImage = cvCloneImage( originalImage );
-		}
+		//InPortの映像の取得
+		memcpy(m_originalImage->imageData,(void *)&(m_img_orig.pixels[0]),m_img_orig.pixels.length());
+		m_currentImage = cvCloneImage( m_originalImage );
 		
-		//	·‚ÌŒvŽZ•û–@‚̐؂è‘Ö‚¦
-		if( differenceMode == COLOR_DIFFERENCE ){	
-			//	¬•ª‚²‚Æ‚É•]‰¿‚ð‚·‚é
-			colorDifference( currentImage, backgroundImage, resultImage );
-		} else if( differenceMode == LAB_DIFFERENCE ){	
-			//	L*a*b*‚Å‹——£‚ð•]‰¿‚·‚é
-			labDifference( currentImage, backgroundImage, resultImage );
-		} else if( differenceMode == GRAY_DIFFERENCE ){
-			//	ƒOƒŒ[ƒXƒP[ƒ‹‚Å•]‰¿‚ð‚·‚é
-			grayScaleDifference( currentImage, backgroundImage, resultImage );
+		//	差の計算方法の切り替え
+		if( m_differenceMode == COLOR_DIFFERENCE ){	
+			//	成分ごとに評価をする
+			colorDifference();
+		} else if( m_differenceMode == LAB_DIFFERENCE ){	
+			//	L*a*b*で距離を評価する
+			labDifference();
+		} else if( m_differenceMode == GRAY_DIFFERENCE ){
+			//	グレースケールで評価をする
+			grayScaleDifference();
 		}
 		
-		//	ƒmƒCƒYœ‹Ž
-		if( noiseMode == NOISE_MORPHOLOGY ){
-			cvErode( resultImage, resultImage );
-			cvDilate( resultImage, resultImage );
-		}else if ( noiseMode == NOISE_MEDIAN ){
-			cvSmooth( resultImage, resultImage, CV_MEDIAN );
+		//	ノイズ除去
+		if( m_noiseMode == NOISE_MORPHOLOGY ){
+			cvErode( m_resultImage, m_resultImage );
+			cvDilate( m_resultImage, m_resultImage );
+		}else if ( m_noiseMode == NOISE_MEDIAN ){
+			cvSmooth( m_resultImage, m_resultImage, CV_MEDIAN );
 		}
 		
-		if( resultImage->origin == 0 ){
-			//@¶ã‚ªŒ´“_‚̏ꍇ
-			//cvFlip( resultImage, resultImage, 0 );
-		}
-		
-		cvMerge( resultImage, resultImage, resultImage, NULL, outputImage );
+		cvMerge( m_resultImage, m_resultImage, m_resultImage, NULL, m_outputImage );
 
-		// ‰æ‘œƒf[ƒ^‚̃TƒCƒYŽæ“¾
-		double len1 = (currentImage->nChannels * currentImage->width * currentImage->height);
-		double len2 = (outputImage->nChannels * outputImage->width * outputImage->height);
-		double len3 = (backgroundImage->nChannels * backgroundImage->width * backgroundImage->height);
+		// 画像データのサイズ取得
+		double len1 = (m_currentImage->nChannels * m_currentImage->width * m_currentImage->height);
+		double len2 = (m_outputImage->nChannels * m_outputImage->width * m_outputImage->height);
+		double len3 = (m_backgroundImage->nChannels * m_backgroundImage->width * m_backgroundImage->height);
 
 		m_img_curr.pixels.length(len1);
 		m_img_resu.pixels.length(len2);
 		m_img_back.pixels.length(len3);
 
-		// ŠY“–‚̃Cƒ[ƒW‚ðMemCopy‚·‚é
-		memcpy((void *)&(m_img_curr.pixels[0]), currentImage->imageData, len1);
-		memcpy((void *)&(m_img_resu.pixels[0]), outputImage->imageData, len2);
-		memcpy((void *)&(m_img_back.pixels[0]), backgroundImage->imageData, len3);
+		// 該当のイメージをMemCopyする
+		memcpy((void *)&(m_img_curr.pixels[0]), m_currentImage->imageData, len1);
+		memcpy((void *)&(m_img_resu.pixels[0]), m_outputImage->imageData, len2);
+		memcpy((void *)&(m_img_back.pixels[0]), m_backgroundImage->imageData, len3);
 
-		m_img_curr.width = originalImage->width;
-		m_img_curr.height = originalImage->height;
+		m_img_curr.width = m_originalImage->width;
+		m_img_curr.height = m_originalImage->height;
 
-		m_img_resu.width = originalImage->width;
-		m_img_resu.height = originalImage->height;
+		m_img_resu.width = m_originalImage->width;
+		m_img_resu.height = m_originalImage->height;
 
-		m_img_back.width = originalImage->width;
-		m_img_back.height = originalImage->height;
+		m_img_back.width = m_originalImage->width;
+		m_img_back.height = m_originalImage->height;
 
 		m_img_currOut.write();
 		m_img_resuOut.write();
 		m_img_backOut.write();
-
-		//	‰æ‘œ‚ð•\Ž¦‚·‚é
-		//cvShowImage( windowNameCurrent, currentImage );
-		//cvShowImage( windowNameResult, resultImage );
-		//cvShowImage( windowNameBackground, backgroundImage );
-				
-		//Key“ü—ÍRead
+			
+		//Key入力Read
 		if(m_keyIn.isNew()){
 			m_keyIn.read();
-		
-		  if(m_cont_mode == 'b'){
-			  if(backgroundImage != NULL) {
-				  cvReleaseImage(&backgroundImage);
+			
+		  if(m_cont_mode == 'b')
+		  {
+		    //背景画像更新
+			  if(m_backgroundImage != NULL) {
+				  cvReleaseImage(&m_backgroundImage);
 			  }
-			  backgroundImage = cvCloneImage(originalImage);
-			  //backgroundImage = NULL;
-			  printf( "Background image update\n" );   //”wŒi‰æ‘œXV
+			  m_backgroundImage = cvCloneImage(m_originalImage);
+			  printf( "Background image update( %s : %s )\n", 
+			          differenceMethod[m_differenceMode].c_str(), noiseMethod[m_noiseMode].c_str() );   
 
-		  }else if(m_cont_mode == 'm'){
-			  differenceMode = differenceMode + 1;
-			  if( differenceMode > GRAY_DIFFERENCE ){
-				  differenceMode = COLOR_DIFFERENCE;
-			  }
-			  printf( "Evaluation method of difference: %s\n", differenceMethod[differenceMode].c_str() );   //·‚Ì•]‰¿•û–@
-		  }else if( m_cont_mode == 'n' ){ 
-			  //	'n'ƒL[‚ª‰Ÿ‚³‚ꂽ‚çƒmƒCƒYœ‹Ž•û–@‚ð•ÏX‚·‚é
-			  noiseMode = noiseMode + 1;
-			  if( noiseMode > NOISE_MEDIAN ){
-				  noiseMode = NOISE_KEEP;
-			  }
-			  printf( "Noise removal method: %s\n", noiseMethod[noiseMode].c_str() );  //ƒmƒCƒYœ‹Ž•û–@
+      }else if(m_cont_mode == 'M')
+		  {
+		    //差の評価方法・ノイズ除去方法変更
+		    m_differenceMode = (int)(m_diff_mode - '0');
+		    m_noiseMode = (int)(m_noise_mode - '0');
+		    printf( "Change method: (diff : noise) = (%s : %s)\n", 
+		            differenceMethod[m_differenceMode].c_str(), noiseMethod[m_noiseMode].c_str() );
 		  }
 		}
 		
-		if(originalImage != NULL){
-			cvReleaseImage(&originalImage);
+		if(m_originalImage != NULL){
+			cvReleaseImage(&m_originalImage);
 		}
-		if(currentImage != NULL){
-			cvReleaseImage(&currentImage);
+		if(m_currentImage != NULL){
+			cvReleaseImage(&m_currentImage);
 		}
-		if(resultImage != NULL){
-			cvReleaseImage(&resultImage);
+		if(m_resultImage != NULL){
+			cvReleaseImage(&m_resultImage);
 		}
-		if(outputImage != NULL){
-			cvReleaseImage(&outputImage);
+		if(m_outputImage != NULL){
+			cvReleaseImage(&m_outputImage);
 		}
 		//if(backgroundImage != NULL){
 		//	cvReleaseImage(&backgroundImage);
 		//}
 		
-		g_temp_w = m_img_orig.width;
-		g_temp_h = m_img_orig.height;
+		m_temp_w = m_img_orig.width;
+		m_temp_h = m_img_orig.height;
 			
 	}
 
@@ -495,8 +347,106 @@
 }
 */
 
+//
+// 成分ごとに評価する
+//
+void BackGroundSubtractionSimple::colorDifference( void )
+{
+	
+	//	画像を生成する
+	IplImage *differenceImage = cvCreateImage(cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_8U, 3);	//	差分画像用IplImage
+	IplImage *differenceRImage = cvCreateImage(cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_8U, 1);	//	R値の差分用IplImage
+	IplImage *differenceGImage = cvCreateImage(cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_8U, 1);	//	G値の差分用IplImage
+	IplImage *differenceBImage = cvCreateImage(cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_8U, 1);	//	B値の差分用IplImage
 
+	//	現在の背景との差の絶対値を成分ごとに取る
+	cvAbsDiff( m_currentImage, m_backgroundImage, differenceImage );
 
+	//	閾値処理を行う
+	cvThreshold( differenceImage, differenceImage, m_nThresholdLv, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
+
+	//	成分ごとの画像に分割する
+	cvSplit( differenceImage, differenceBImage, differenceGImage, differenceRImage, NULL );
+
+	//	ORで合成する
+	cvOr( differenceRImage, differenceGImage, m_resultImage );
+	cvOr( differenceBImage, m_resultImage, m_resultImage );
+
+	//	メモリを解放する
+	cvReleaseImage( &differenceImage );
+	cvReleaseImage( &differenceRImage );
+	cvReleaseImage( &differenceGImage );
+	cvReleaseImage( &differenceBImage );
+
+}
+
+//
+//	L*a*b*で距離を評価する
+//
+void BackGroundSubtractionSimple::labDifference( void )
+{
+
+	//	画像を生成する
+	IplImage *currentLabImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height),IPL_DEPTH_32F, 3 );		//	現在の画像をL*a*b*に変換した画像用IplImage
+	IplImage *backgroundLabImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 3 );	//	背景をL*a*b*に変換した画像用IplImage
+	IplImage *differenceLabImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 3 );	//	差分画像用IplImage
+	IplImage *differenceLImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 1 );		//	L*値の差分用IplImage
+	IplImage *differenceAImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 1 );		//	a*値の差分用IplImage
+	IplImage *differenceBImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 1 );		//	b*値の差分用IplImage
+	IplImage *sqrDifferenceImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_32F, 1 );	//	距離算出用IplImage
+
+	//	現在の画像と背景を共に CIE L*a*b* に変換
+	cvConvertScale( m_currentImage, currentLabImage, SCALE );
+	cvConvertScale( m_backgroundImage, backgroundLabImage, SCALE );
+	cvCvtColor( currentLabImage, currentLabImage, CV_BGR2Lab );
+	cvCvtColor( backgroundLabImage, backgroundLabImage, CV_BGR2Lab );
+
+	//	距離の二乗を計算する
+	cvSub( currentLabImage, backgroundLabImage, differenceLabImage );
+	cvPow( differenceLabImage, differenceLabImage, 2 );
+
+	//	成分ごとの画像に分割する
+	cvSplit( differenceLabImage, differenceLImage, differenceAImage, differenceBImage, NULL );
+
+	cvCopy( differenceLImage, sqrDifferenceImage );
+	cvAdd( differenceAImage, sqrDifferenceImage, sqrDifferenceImage );
+	cvAdd( differenceBImage, sqrDifferenceImage, sqrDifferenceImage );
+
+	//	閾値処理を行う
+	cvThreshold( sqrDifferenceImage, m_resultImage, m_nThresholdLv * m_nThresholdLv, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
+
+	//	メモリを解放する
+	cvReleaseImage( &currentLabImage );
+	cvReleaseImage( &backgroundLabImage );
+	cvReleaseImage( &differenceLabImage );
+	cvReleaseImage( &differenceLImage );
+	cvReleaseImage( &differenceAImage );
+	cvReleaseImage( &differenceBImage );
+	cvReleaseImage( &sqrDifferenceImage );
+}
+
+//
+//	グレースケールで評価する
+//
+void BackGroundSubtractionSimple::grayScaleDifference( void )
+{
+
+	//	画像を生成する
+	IplImage *differenceImage = cvCreateImage( cvSize(m_currentImage->width, m_currentImage->height), IPL_DEPTH_8U, 3 );	//	差分画像用IplImage
+
+	//	現在の背景との差の絶対値を成分ごとに取る
+	cvAbsDiff( m_currentImage, m_backgroundImage, differenceImage );
+
+	//	BGRからグレースケールに変換する
+	cvCvtColor( differenceImage, m_resultImage, CV_BGR2GRAY );
+
+	//	グレースケールから2値に変換する
+	cvThreshold( m_resultImage, m_resultImage, m_nThresholdLv, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
+
+	//	メモリを解放する
+	cvReleaseImage( &differenceImage );
+}
+
 extern "C"
 {
  



More information about the openrtm-commit mailing list