- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试构建 OpenCV 附带的示例程序 brief_match_test.cpp
,但是当我运行该程序时,我不断从 cv::findHomography() 函数中收到此错误:
OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.3/modules/core/src/matrix.cpp, line 1421
libc++abi.dylib: terminate called throwing an exception
findHomography ... Abort trap: 6
我是这样编译的:
g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` brief_match_test.cpp -o brief_match_test
我已经在程序中添加了一些内容来显示 FAST 算法找到的关键点,但还没有触及处理单应性的部分。我将包括我修改过的示例,以防万一我搞砸了:
/*
* matching_test.cpp
*
* Created on: Oct 17, 2010
* Author: ethan
*/
#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <vector>
#include <iostream>
using namespace cv;
using namespace std;
//Copy (x,y) location of descriptor matches found from KeyPoint data structures into Point2f vectors
static void matches2points(const vector<DMatch>& matches, const vector<KeyPoint>& kpts_train,
const vector<KeyPoint>& kpts_query, vector<Point2f>& pts_train, vector<Point2f>& pts_query)
{
pts_train.clear();
pts_query.clear();
pts_train.reserve(matches.size());
pts_query.reserve(matches.size());
for (size_t i = 0; i < matches.size(); i++)
{
const DMatch& match = matches[i];
pts_query.push_back(kpts_query[match.queryIdx].pt);
pts_train.push_back(kpts_train[match.trainIdx].pt);
}
}
static double match(const vector<KeyPoint>& /*kpts_train*/, const vector<KeyPoint>& /*kpts_query*/, DescriptorMatcher& matcher,
const Mat& train, const Mat& query, vector<DMatch>& matches)
{
double t = (double)getTickCount();
matcher.match(query, train, matches); //Using features2d
return ((double)getTickCount() - t) / getTickFrequency();
}
static void help()
{
cout << "This program shows how to use BRIEF descriptor to match points in features2d" << endl <<
"It takes in two images, finds keypoints and matches them displaying matches and final homography warped results" << endl <<
"Usage: " << endl <<
"image1 image2 " << endl <<
"Example: " << endl <<
"box.png box_in_scene.png " << endl;
}
const char* keys =
{
"{1| |box.png |the first image}"
"{2| |box_in_scene.png|the second image}"
};
int main(int argc, const char ** argv)
{
Mat outimg;
help();
CommandLineParser parser(argc, argv, keys);
string im1_name = parser.get<string>("1");
string im2_name = parser.get<string>("2");
Mat im1 = imread(im1_name, CV_LOAD_IMAGE_GRAYSCALE);
Mat im2 = imread(im2_name, CV_LOAD_IMAGE_GRAYSCALE);
if (im1.empty() || im2.empty())
{
cout << "could not open one of the images..." << endl;
cout << "the cmd parameters have next current value: " << endl;
parser.printParams();
return 1;
}
double t = (double)getTickCount();
FastFeatureDetector detector(15);
BriefDescriptorExtractor extractor(32); //this is really 32 x 8 matches since they are binary matches packed into bytes
vector<KeyPoint> kpts_1, kpts_2;
detector.detect(im1, kpts_1);
detector.detect(im2, kpts_2);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "found " << kpts_1.size() << " keypoints in " << im1_name << endl << "fount " << kpts_2.size()
<< " keypoints in " << im2_name << endl << "took " << t << " seconds." << endl;
drawKeypoints(im1, kpts_1, outimg, 200);
imshow("Keypoints - Image1", outimg);
drawKeypoints(im2, kpts_2, outimg, 200);
imshow("Keypoints - Image2", outimg);
Mat desc_1, desc_2;
cout << "computing descriptors..." << endl;
t = (double)getTickCount();
extractor.compute(im1, kpts_1, desc_1);
extractor.compute(im2, kpts_2, desc_2);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "done computing descriptors... took " << t << " seconds" << endl;
//Do matching using features2d
cout << "matching with BruteForceMatcher<Hamming>" << endl;
BFMatcher matcher_popcount(NORM_HAMMING);
vector<DMatch> matches_popcount;
double pop_time = match(kpts_1, kpts_2, matcher_popcount, desc_1, desc_2, matches_popcount);
cout << "done BruteForceMatcher<Hamming> matching. took " << pop_time << " seconds" << endl;
vector<Point2f> mpts_1, mpts_2;
cout << "matches2points ... ";
matches2points(matches_popcount, kpts_1, kpts_2, mpts_1, mpts_2); //Extract a list of the (x,y) location of the matches
cout << "done" << endl;
vector<char> outlier_mask;
cout << "findHomography ... ";
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
cout << "done" << endl;
cout << "drawMatches ... ";
drawMatches(im2, kpts_2, im1, kpts_1, matches_popcount, outimg, Scalar::all(-1), Scalar::all(-1), outlier_mask);
cout << "done" << endl;
imshow("matches - popcount - outliers removed", outimg);
Mat warped;
Mat diff;
warpPerspective(im2, warped, H, im1.size());
imshow("warped", warped);
absdiff(im1,warped,diff);
imshow("diff", diff);
waitKey();
return 0;
}
最佳答案
我不确定,所以我真的要回答这个问题,因为到目前为止还没有其他人回答过这个问题,而且距您提出这个问题已经 10 个小时了。
我的第一个想法是您没有足够的点对。一个单应性至少需要4对,否则找不到唯一解。您可能需要确保仅在匹配项数量至少为 4 时才调用 findHomography。
或者,问题here和 here是关于相同的失败断言(虽然是由调用与您不同的函数引起的)。我猜 OpenCV 会进行某种形式的动态类型检查或模板化,这样本应在编译时发生的类型不匹配错误最终会以断言失败的形式成为运行时错误。综上所述,也许您应该在传递给 findHomography 之前将 mpts_1 和 mpts_2 转换为 cv::Mat。
关于c++ - OpenCV findHomography 断言失败错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992488/
目标:从相机透视图中获取一个点(或一组点)并将其转换到相应的地平面点。 方法:使用findHomography来获取单应性Mat。计划使用perspectiveTransform()。 问题:无法解释
我用过这个code作为在场景中检测我的矩形目标的基础。我使用 ORB 和 Flann Matcher。我已经能够使用 findHomography() 和 perspectiveTransform()
使用 opencv2 - 2.4.9 尝试使用 cv2.findHomography 计算单应矩阵时出现以下错误。我使用的值显然有问题,尤其是 rect_points 矩阵。如果我更改矩阵的值以使它们
我想旋转图像而不求助于 cv2.warpPerspective()。如何从 cv2.findHomography() 函数输出中获取角度? It didn't help # Find homograp
我尝试在以下 opencv/c++ 示例中运行代码片段 http://docs.opencv.org/3.1.0/d7/dff/tutorial_feature_homography.html#gsc
我看了这段代码,它给出了 http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.h
我让用户在两张图片上选择 5 个点,它们的大小不一样(也许这就是问题所在)。当用户在任意图像上选择一个点时,我将 Point2f 推到一个专用于该特定图像的 vector 。 所以在一个实例中我有以下
我试图在 Python 中使用 opencv 为 rgb 和 rotated 找到两个图像的单应矩阵: print(rgb.shape, rotated.shape) H = cv2.findHomo
当使用 findHomography() 时: Mat H = findHomography( obj, scene, cv::RANSAC , 3, hom_mask, 2000, 0.995 );
我正在尝试构建 OpenCV 附带的示例程序 brief_match_test.cpp,但是当我运行该程序时,我不断从 cv::findHomography() 函数中收到此错误: OpenCV Er
我正在使用 features2d(ORB、SIFT 等)进行一些对象检测 我正在使用 RANSAC 进一步研究单应性。我发现很多好的点被错误地标记为异常值。 对象(书)内部有很多不应该是异常值的异常值
我正在 OpenCV 中开发全景图/全景图应用程序,但遇到了一个我真的无法弄清楚的问题。要了解全景照片的外观,请查看全景图维基百科文章:http://en.wikipedia.org/wiki/Pan
我正在使用 OpenCV 的 SURF 特征检测来比较两个图像。当我选择两个相同的图像(有时选择相同的图像)时,我得到这个: OpenCV Error: Assertion failed (CV_I
我正在为 opencv 使用 python 绑定(bind)。我正在使用关键点检测和描述(即 SURF、SIFT、...)来查找包含在目标图像中的模板图像,但是有一个问题:模板可以在目标图像中“挤压”
我目前迷失在 OpenCV 文档中,正在寻找一些关于函数可能排序的指导,或者可能是 OpenCV 中我还没有遇到的函数...... 我正在跟踪摄像机馈送中的激光 Blob 到投影屏幕上的某个位置。到目
我已经检查过 stackOverflaw,尤其是在这个 link 中但它没有回答我的问题。 我使用 Ransac 和 OpenCv 计算单应性以匹配两张图片。这里对应的代码: Mat H = find
这里是Features2D + Homography 从打开的 cv 文档中查找已知对象的代码 #include #include #include #include #include #in
我无法使用 OpenCV 示例在 Android 场景中查找对象。我从 OpenCV4Android SDK 中获取预构建的静态库。我的安卓.mk # Open CV libraries in
作为调用 findHomography() 的结果,我得到了一个 3x3 矩阵 mtx[3][3]。该矩阵包含 mtx[0][2] 和 mtx[1][2] 中的翻译部分。但是我怎样才能从这个 3x3
我将 OpenCV 的函数 findHomography 与 RANSAC 方法结合使用,以便找到将两个图像与一组关键点相关联的单应性。 主要问题是我在任何地方都找不到函数输出的掩码矩阵的值是多少。
我是一名优秀的程序员,十分优秀!