2013-08-04 2 views
0

opencv에서 트랙 바를 사용하는 데 문제가 있습니다. 개체 인식을 위해 SURF에서 참조 이미지를 변경하기를 원하지만 문제는 내 프로그램에서 하나의 참조 이미지 만 감지된다는 것입니다.OPENCV 트랙 바에서 문제 발생.

나는 이것이 매우 기본적인 것이지만 나는 opencv에 익숙하다는 것을 알고있다. 누군가가 내게 해결책을 주길 바란다.

감사합니다.

#include <iostream> 
#include <opencv/cxcore.h> 
#include <opencv2\imgproc\imgproc_c.h> 
#include <stdio.h> 
#include <math.h> 
#include <opencv\highgui.h> 
#include <opencv\cv.h> 
#include <opencv2/features2d/features2d.hpp> 
#include <opencv2/calib3d/calib3d.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/nonfree/features2d.hpp> 
#include <opencv2/legacy/legacy.hpp> 
#include <opencv2\nonfree\nonfree.hpp> 

using namespace std; 
#include "MareMatchingClass.h" 

int colorInt; 
int g_switch_value=0; 

// Trackbar/switch callback 
void switch_callback(int position){ 

if(g_switch_value == 0){ 
    colorInt = 0; 
}else{ 
    colorInt = 1; 
} 
} 

int main() 
{ 


cv::initModule_nonfree(); 

IplImage* PatchImg; 

cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE); 
cvCreateTrackbar("Switch","mainWin", &g_switch_value, 1, switch_callback); 

if(colorInt == 0) 
{ 
     PatchImg = cvLoadImage("D:/id2.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
} 
else 
{ 

     PatchImg = cvLoadImage("D:/id.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

} 

//Create Matching class 
CMareMatchingClass MMathing;  
//Input PatchImg 
MMathing.ExtractPatchSurf(PatchImg); 

double cornerPt[9]={ 
    MMathing.PatchWidth/2, 0,      MMathing.PatchWidth, 
    0,      MMathing.PatchHeight, MMathing.PatchHeight, 
    1,      1,      1}; 
CvMat* McornerPt2 = cvCreateMat(3, 3, CV_64FC1); 
memcpy(McornerPt2->data.db, cornerPt, sizeof(double)*9); 



int c; 
IplImage* img; 
IplImage* BackGroundImg = NULL; 
CvCapture* capture = cvCaptureFromCAM(0); 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320); 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240); 


while(1) 
{ 
    cvGrabFrame(capture); 
    img = cvRetrieveFrame(capture); 

    if(BackGroundImg == NULL) 
    { 
     BackGroundImg = cvCreateImage(cvSize(img->width, img->height), 8, 1); 
    } 
    cvCvtColor(img, BackGroundImg, CV_RGB2GRAY); 

    Rect4Pt rect4pt; 

    if(MMathing.GetObjectRectAndBestH(BackGroundImg, &rect4pt) != 0) 
    { 
     cvLine(img, cvPoint(rect4pt.LeftTop.x, rect4pt.LeftTop.y), 
cvPoint(rect4pt.RightTop.x, rect4pt.RightTop.y), cvScalar(255,0,0), 2); 
     cvLine(img, cvPoint(rect4pt.RightTop.x, rect4pt.RightTop.y), 
cvPoint(rect4pt.RightBottom.x, rect4pt.RightBottom.y), cvScalar(255,0,0), 2); 
     cvLine(img, cvPoint(rect4pt.RightBottom.x, rect4pt.RightBottom.y), 
cvPoint(rect4pt.LeftBottom.x, rect4pt.LeftBottom.y), cvScalar(255,0,0), 2); 
     cvLine(img, cvPoint(rect4pt.LeftBottom.x, rect4pt.LeftBottom.y), 
cvPoint(rect4pt.LeftTop.x, rect4pt.LeftTop.y), cvScalar(255,0,0), 2); 

     Rect4Pt rect4ptZ; 
     MMathing.GetHMulRect(McornerPt2,&rect4ptZ); 

    }  


    cvShowImage("mainWin",img); 

    c = cvWaitKey(10); 
    if(c == 27) 
     break; 
} 

cvReleaseCapture(&capture); 
cvDestroyAllWindows(); 
cvReleaseImage(&PatchImg); 
cvReleaseImage(&BackGroundImg); 
cvReleaseMat(&McornerPt2); 



} 

답변

0

난 당신이 while 루프 내부의 코드를

if(colorInt!=lastColorInt) 
{ 
    if(colorInt == 0) 
    { 
      PatchImg = cvLoadImage("D:/id2.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    } 
    else 
    { 
      PatchImg = cvLoadImage("D:/id.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    } 
lastColorInt=colorInt; 
} 

를 이동하고 (I 예를 들어, 변경으로) colorInt 변수의 상태를 변경을 찾고 그것을 변경해야 할 것 같아요. 할당 된 이미지를 놓치는 것을 잊지 마십시오.

+0

제안을 시도했지만 "변수 'PatchImg'가 초기화되지 않고 사용 중입니다."라는 오류가 나타납니다. lastColorInt의 값은 무엇입니까? 그리고 어떻게 변화하는 상태 변수를 바꿀 수 있습니까? 감사합니다 – user2529081

+0

포인터를 초기화해야하므로 할당해야합니다 : PatchImg = NULL; 처음에는 lastColorInt는 colorInt와 같은 형태이며, colorInt와 같은 값으로 초기화된다 위 코드에서 이미 구현 된 상태 전환 캐치. –