이 경우 다른 사람이 실제로 선택한 이미지를 추출하는 방법에 대한 관심,
여기에 내가 할 수 있었던 방법은 다음과 같습니다
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;
}
}
}
}
당신이 IplImage (C)가 아닌 이력서를 사용하는 이유 :: 매트 (C++)? – hetepeperfan
@hetepeperfan 솔직히 말하면 C와 C++ 구현 (및 버전)의 차이점과 일부 컴파일러가 찾지 못하는 OpenCV 함수를 참조하는 몇 가지 코드 샘플이 어떻게 다른지 혼란 스러울뿐만 아니라 함수 자체는 엄격하게 C 또는 C++ 구현이며 해당 함수가 속한 OpenCV의 버전입니다. 적어도 OpenCV를 배우는 동안, 나는 단순히 "나에게 맞는 것"을 사용하고 있습니다 ... 그리고 대부분은 cv :: Mat에 비해서 IplImage를 사용하는 것을 포함합니다. 구현을 서로 섞어서는 안된다고 읽으십시오. – RectangleEquals
@hetepeperfan 그리고 간단히 말해서 OpenCV의 설명서가 매우 모호하다는 것을 알게되었습니다. – RectangleEquals