2013-05-22 1 views
0

내 프로젝트는 주어진 창의 클라이언트 영역에 대한 비트 맵 스냅 샷을 취하여이 데이터를 IplImage 인스턴스로 변환합니다. 그런 다음 그레이 스케일 변환, 타작 등 후 경계 상자는 주어진 최소 크기 (영역 볼륨)를 초과하는 윤곽선 주위에 그려집니다.
결과는 다음 cvNamedWindow마우스를 사용하여 윤곽 따기?

내에서 표시됩니다 내가 지금해야 할 일은 사용자가 응용 프로그램이 다음 새 이미지로 subrect를 추출 할 수 있도록 효율적으로,이 윤곽을 "선택"이들의 구형 내부를 클릭 할 수 있습니다 디스크에 저장하십시오.

OpenCV를 사용하여 C++에서 어떻게 구현할 수 있습니까?

+1

당신이 IplImage (C)가 아닌 이력서를 사용하는 이유 :: 매트 (C++)? – hetepeperfan

+0

@hetepeperfan 솔직히 말하면 C와 C++ 구현 (및 버전)의 차이점과 일부 컴파일러가 찾지 못하는 OpenCV 함수를 참조하는 몇 가지 코드 샘플이 어떻게 다른지 혼란 스러울뿐만 아니라 함수 자체는 엄격하게 C 또는 C++ 구현이며 해당 함수가 속한 OpenCV의 버전입니다. 적어도 OpenCV를 배우는 동안, 나는 단순히 "나에게 맞는 것"을 사용하고 있습니다 ... 그리고 대부분은 cv :: Mat에 비해서 IplImage를 사용하는 것을 포함합니다. 구현을 서로 섞어서는 안된다고 읽으십시오. – RectangleEquals

+0

@hetepeperfan 그리고 간단히 말해서 OpenCV의 설명서가 매우 모호하다는 것을 알게되었습니다. – RectangleEquals

답변

2

경계 상자를 저장하는 경우 상자를 클릭하고 어떤 상자를 클릭하면 마우스 이벤트 핸들러에서 for 루프를 확인할 수 있습니다. 마우스 이벤트를 작성하는 코드 :

cvNamedWindow("MyWindow", CV_WINDOW_NORMAL); 
cvSetMouseCallback("MyWindow", mouseEvent, 0); 
imshow("MyWindow", image); 

void mouseEvent(int evt, int x, int y, int flags, void *param) { 
    if (evt == CV_EVENT_LBUTTONDOWN) { 
     printf("%d %d\n", x, y); 
    } 
} 

이러한 좌표가 경계 상자 내에 있는지 확인하는 방법은 사용자 스스로 찾을 수 있습니다. 주석에 언급 된대로 C++ API를 사용하는 것이 좋습니다. 한 번 처리하면 훨씬 쉽습니다.

0

이 경우 다른 사람이 실제로 선택한 이미지를 추출하는 방법에 대한 관심,
여기에 내가 할 수 있었던 방법은 다음과 같습니다

inline 
IplImage* getSubImage(IplImage *image, CvRect region) 
{ 
    cvSetImageROI(image, region); 
    IplImage *imgRet = cvCreateImage(cvSize(region.width, region.height), image->depth, image->nChannels); 
    cvCopy(image, imgRet); 
    cvResetImageROI(image); 
    return imgRet; 
} 

inline 
bool pointInRect(const int x, const int y, const CvRect& r) 
{ 
    return (
     (x > r.x) && (x < (r.x + r.width)) && 
     (y > r.y) && (y < (r.y + r.height)) 
    ); 
} 

void onMouseEvent(int evt, int x, int y, int flags, void *param) 
{ 
    if (evt == CV_EVENT_LBUTTONDOWN) { 
     // boundingBoxes is declared as a vector of CvRects and 
     // filled in the main loop using cvBoundingRect(contour) 
     for(UINT i = 0; i < boundingBoxes.size(); i++) 
     { 
      CvRect rect = boundingBoxes[i].rect; 
      if(pointInRect(x, y, rect)) 
      { 
       IplImage* img = getSubImage(imgSource, rect); 
       // Do whatever you want with the sub-image here 
       cvNamedWindow("Selection"); 
       cvShowImage("Selection", img); 
       cvReleaseImage(&img); 
       break; 
      } 
     } 
    } 
}