【发布时间】:2017-06-29 21:38:15
【问题描述】:
我有立体摄像头设置。我正在使用 openCv 在图像中查找特征。我需要做的是匹配上一个和当前(左)帧中的特征,然后在当前(右)帧中找到与 那些 特征匹配的特征,这样我就可以对它们进行三角测量。我需要最终得到三组特征描述符和关键帧,匹配三张图像。
到目前为止我的代码是:
//storage
cv::Mat descCurrent;
cv::Mat descCurrentR;
cv::Mat descPrevious;
std::vector<cv::KeyPoint> keyPntsCurrent;
std::vector<cv::KeyPoint> keyPntsCurrentMatch;
std::vector<cv::KeyPoint> keyPntsCurrentR;
std::vector<cv::KeyPoint> keyPntsPrevious;
//On the FIRST frame
keyPntsPrevious = kaze->DetectKeypoints(imLeft, descPrevious);
// on the CURRENT frame
//detect the keypoints on Left and Right Current images
kaze->DetectKeypointsL(imLeft, descCurrent, keyPntsCurrent);
kaze->DetectKeypointsR(imRight, descCurrentR, keyPntsCurrentR);
//match to previous frame
std::vector<cv::DMatch> match = pntMatch->matchPoints(descPrevious, descCurrent);
//get current - previous descriptors to use for left - right matching
if (match.size() > 1)
{
for (int m = 0; m < match.size(); m++)
{
// feature index OF PREVIOUS FRAME DESC
float* descVector = descCurrent.ptr<float>(match[m].trainIdx);
descTmp.push_back(descVector);
//feature index OF CURRENT FRAME KEY
keyPntsCurrentMatch.push_back(keyPntsCurrent[match[m].trainIdx]);
}
}
// memcpy(descCurrentMatched.data, descTmp.data(), descTmp.size()*sizeof(float));
descTmp.clear();
//match to RIGHT frame
std::vector<cv::DMatch> matchR = pntMatch->matchPoints(descCurrentMatched, descCurrentR);
//triangulate
PointsTo3d(keyPntsCurrentMatch, keyPntsCurrentR, matchR);
//at end of loop
descPrevious = descCurrentMatched;
keyPntsPrevious = keyPntsCurrent;
keyPntsCurrentMatch.clear();
这一行:
memcpy(descCurrentMatched.data, descTmp.data(), descTmp.size()*sizeof(float));
当前使应用程序崩溃,没有错误。所以我的问题是:
这是匹配动态视频流中三个图像的特征的有效方法吗?
如果是这样,为什么memcpy 会崩溃?
谢谢。
【问题讨论】:
标签: c++ opencv computer-vision