我想使用 cameraStream + openCV 检测自定义形状。
现在,我想检测现实图像中形状的位置。另外,我还需要获得此图中显示的形状的一些特征点:
因此,我很确定仅检测轮廓不会完全解决问题。同样, HoughTransform 并不是一个很好的方法,因为轮廓可能更像是一个疯狂的椭圆而不是一个圆。另一个缺点是几乎不可能检测到带有蓝色标记的点。
我很确定我需要使用功能匹配或关键点检测,但是我真的不知道如何在相机中实现此功能流以及如何将标记为蓝色的点检测为关键点。
cv::Mat detectShape(cv::Mat defaultMat) {
Mat rawMat = defaultMat;
cvtColor(rawMat, rawMat, CV_BGR2RGB);
Mat grayMat;
rawMat.copyTo(grayMat);
cvtColor(grayMat, grayMat, CV_RGB2GRAY);
cv::Canny(grayMat, grayMat, 100, 200, 3);
vector<vector<cv::Point>> contours;
vector<Vec4i> hierarchy;
findContours(grayMat, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
for (int i=0; i< contours.size(); i++) {
vector<cv::Point> contour = contours[i];
std::sort(contour.begin(), contour.end(), [](const cv::Point& a, const cv::Point& b) { return a.x < b.x; });
cv::Point minX = contour[0];
cv::circle(rawMat, minX, 5, Scalar(255, 0, 255), CV_FILLED);
cv::Point maxX = contour.back();
cv::circle(rawMat, maxX, 5, Scalar(255, 0, 0), CV_FILLED);
std::sort(contour.begin(), contour.end(), [](const cv::Point& a, const cv::Point& b) { return a.y < b.y; });
cv::Point minY = contour[0];
cv::circle(rawMat, minY, 5, Scalar(0, 0, 255), CV_FILLED);
cv::Point maxY = contour.back();
cv::circle(rawMat, maxY, 5, Scalar(255, 255, 0), CV_FILLED);
}
// how to apply feature detection?
return rawMat;
}
注意:摄像机流的每一帧都会调用detectShape
,其结果将显示为摄像机帧。