- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从不同的图像构建全景 View 。最初我尝试拼接两张图像作为全景构建的一部分。我要拼接的两个输入图像是:
我使用 ORB 特征描述子来寻找图像中的特征,然后我找出了这两幅图像之间的单应矩阵。我的代码是:
int main(int argc, char **argv){
Mat img1 = imread(argv[1],1);
Mat img2 = imread(argv[2],1);
//-- Step 1: Detect the keypoints using orb Detector
std::vector<KeyPoint> kp2,kp1;
// Default parameters of ORB
int nfeatures=500;
float scaleFactor=1.2f;
int nlevels=8;
int edgeThreshold=15; // Changed default (31);
int firstLevel=0;
int WTA_K=2;
int scoreType=ORB::HARRIS_SCORE;
int patchSize=31;
int fastThreshold=20;
Ptr<ORB> detector = ORB::create(
nfeatures,
scaleFactor,
nlevels,
edgeThreshold,
firstLevel,
WTA_K,
scoreType,
patchSize,
fastThreshold );
Mat descriptors_img1, descriptors_img2;
//-- Step 2: Calculate descriptors (feature vectors)
detector->detect(img1, kp1,descriptors_img1);
detector->detect(img2, kp2,descriptors_img2);
Ptr<DescriptorExtractor> extractor = ORB::create();
extractor->compute(img1, kp1, descriptors_img1 );
extractor->compute(img2, kp2, descriptors_img2 );
//-- Step 3: Matching descriptor vectors using FLANN matcher
if ( descriptors_img1.empty() )
cvError(0,"MatchFinder","1st descriptor empty",__FILE__,__LINE__);
if ( descriptors_img2.empty() )
cvError(0,"MatchFinder","2nd descriptor empty",__FILE__,__LINE__);
descriptors_img1.convertTo(descriptors_img1, CV_32F);
descriptors_img2.convertTo(descriptors_img2, CV_32F);
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors_img1,descriptors_img2,matches);
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_img1.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist )
min_dist = dist;
if( dist > max_dist )
max_dist = dist;
}
printf("-- Max dist : %f \n", max_dist );
printf("-- Min dist : %f \n", min_dist );
//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< DMatch > good_matches;
for( int i = 0; i < descriptors_img1.rows; i++ )
{
if( matches[i].distance < 3*min_dist )
{
good_matches.push_back( matches[i]);
}
}
Mat img_matches;
drawMatches(img1,kp1,img2,kp2,good_matches,img_matches,Scalar::all(-1),
Scalar::all(-1),vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
std::vector<Point2f> obj;
std::vector<Point2f> scene;
for( int i = 0; i < good_matches.size(); i++ )
{
//-- Get the keypoints from the good matches
obj.push_back( kp1[ good_matches[i].queryIdx ].pt );
scene.push_back( kp2[ good_matches[i].trainIdx ].pt );
}
Mat H = findHomography( obj, scene, CV_RANSAC );
后来有些人告诉我包含以下代码
cv::Mat result;
warpPerspective( img1, result, H, cv::Size( img1.cols+img2.cols, img1.rows) );
cv::Mat half(result, cv::Rect(0, 0, img2.cols, img2.rows) );
img2.copyTo(half);
imshow("result",result);
我正在尝试实现拼接功能,所以我不想使用内置的 opencv 拼接功能。任何人都可以告诉我哪里出错并更正我的代码。提前致谢
最佳答案
图像拼接包括以下步骤:
您必须执行所有这些步骤才能获得完美的结果。在您的代码中,您只完成了第一部分,即特征查找。
您可以在 Learn OpenCV 中找到有关图像拼接工作原理的详细说明。
我还有 Github 上的代码
希望这对您有所帮助。
关于c++ - 全景影像构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45114967/
我有一个关于滚动无休止地 self 重复的背景图像的问题。我遇到的问题是它开始很快,但很快变得越来越慢(口吃等)。这是代码: var panoramaTimeOutId = null; var pan
所以我生成了一个漂亮的全景查看器,但相机指向下方。这意味着如果我将手机像放在 table 上一样平放,它就会旋转并很好地环顾球体。我希望能够保持正常(向上)并环顾四周。这是我的代码。 我在这里使用了一
对于一个特殊的项目,我需要找到一个 API/DLL/Library 来帮助我使用该图像的一部分创建一个大图像。例如,如果有人拍摄 4 张代表他周围 360 度的照片,他将能够通过使用识别某些模式的特殊
这是我的情况。 ViewModelA { ObservableCollection ItemsA ObservableCollection ViewModelBs } 将数据上下文
两周以来,我一直在努力解决这个问题,没有使用 Pannellum,而是使用各种 Js 库,其中包括 ThreeJS,但没有成功。 Pannellum 看起来很有前途,并且已经看到它支持部分全景图(1
以前实现的全景照片的 URL 包含全景 ID,因此可以轻松地将特定全景图嵌入到 iframe 中。我似乎无法在新的 Google map 中找到 ID。有什么方法可以在不借助 Javascript 的
这开始让我烦恼,但我一定是犯了一些非常简单的错误。我目前有以下 XAML 代码: 在我需要用名称初始化文本 bl
我有一个非常奇怪的错误,对于大多数坐标,GMSPanoramaView 第二次不起作用。 (女巫 GMSPanoramaView 每次都工作 有一个坐标) By 不起作用,我的意思是它只是黑色 Vie
如果我在 VrPanoramaView 中插入 360 度图像,则图像会成功显示和旋转,但在此库中只有一次单击事件,即 panoramaView.setEventListener(new VrPano
我是一名优秀的程序员,十分优秀!