是否有一种快速的解决方案来仅在我插入的斑点的轮廓内指定ROI?
到目前为止,我的想法是:
提前致谢!
编辑
我找到了我需要的东西:cv::pointPolygonTest()似乎是正确的事情,但是我不确定如何实现它……
这是一些代码:
// ...
IplImage forground_ipl = result;
IplImage *labelImg = cvCreateImage(forground.size(), IPL_DEPTH_LABEL, 1);
CvBlobs blobs;
bool found = cvb::cvLabel(&forground_ipl, labelImg, blobs);
IplImage *imgOut = cvCreateImage(cvGetSize(&forground_ipl), IPL_DEPTH_8U, 3);
if (found) {
vb::CvBlob *greaterBlob = blobs[cvb::cvGreaterBlob(blobs)];
cvb::cvRenderBlob(labelImg, greaterBlob, &forground_ipl, imgOut);
CvContourPolygon *polygon = cvConvertChainCodesToPolygon(&greaterBlob->contour);
}
“多边形”包含我需要的轮廓。
goodFeaturesToTrack通过以下方式实现:
- (std::vector<cv::Point2f>)pointsFromGoodFeaturesToTrack:(cv::Mat &)_image
{
std::vector<cv::Point2f> corners;
cv::goodFeaturesToTrack(_image,corners, 100, 0.01, 10);
return corners;
}
因此,接下来我需要遍历角落并使用cv::pointPolygonTest()检查每个点,对吗?
最佳答案
您可以在您感兴趣的区域上创建蒙版:
编辑
如何制作口罩:
做一个面具;
Mat mask(origImg.size(), CV_8UC1);
mask.setTo(Scalar::all(0));
// here I assume your contour is extracted with findContours,
// and is stored in a vector<vector<Point>>
// and that you know which contour is the blob
// if it's not the case, use fillPoly instead of drawContour();
Scalar color(255,255,255); // white. actually, it's monchannel.
drawContours(mask, contours, contourIdx, color );
// fillPoly(Mat& img, const Point** pts, const int* npts,
// int ncontours, const Scalar& color)
现在,您可以使用它了。 但是,请仔细查看结果-我听说过OpenCV中有关特征提取器的mask参数的一些错误,但我不确定是否与此相关。
// note the mask parameter:
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners,
double qualityLevel, double minDistance,
InputArray mask=noArray(), int blockSize=3,
bool useHarrisDetector=false, double k=0.04 )
这也将提高您的复制速度-goodFeaturesToTrack会花费大量时间,如果仅将其应用于较小的图像,则总体增益将非常可观。