我正在用opencv和立体相机做一个程序。我想知道在第二台摄像机中检测到的点,在第一台摄像机中检测到的点是什么。我认为我有一些探测器,提取器和匹配方法,并且按照opencv中的示例我有一个算法来过滤匹配并且只绘制好的匹配但在我的情况下min_dist参数取决于我的trackBar位置。
这是opencv示例的代码:http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html#feature-flann-matcher
我做了一些改变来移动比赛之间的最小距离。
//TrackBar position
dist_track = getTrackbarPos(nombreTrackbar, BUTTON_WINDOW);
cout <<"Posicion de la barra: " << dist_track << endl;
good_matches.clear();
//Obtain good_matches
for( int i = 0; i < descriptors[0].rows; i++ )
{ if( matches[i].distance <= coef*dist_track)
{ good_matches.push_back( matches[i]);}
}
主要的想法是,当我把trackBar放在开头时我有正确的匹配但是当轨道栏被放到最后时,我找到的匹配不正确。在这种情况下,我发现了很多比赛,但其中很多都是错的。
现在我正在尝试正确处理图像。我想在绘图匹配功能中使用遮罩来强制检测到的第二个摄像头点必须靠近极线。有人能问我一些关于它的事吗? 有人知道如何使用mask参数强制创建的匹配器需要在极线中吗?
或者如何创建蒙版参数?
谢谢啦!
答案 0 :(得分:0)
最后我决定改变我的运作方式。我正在尝试剪切原始图像并仅保留必要的信息。我的意思是我得到了它不关心我的应用程序的照片信息,只保留我要使用的信息。
我的想法是使用两个相机的极线来确定我所拥有的感兴趣区域,我将计算两个图像中的极线的位置然后切割图像并且仅将信息保持在极线的位置
这样做我获得了两个新图像,我的想法是将新闻图像传递给匹配器方法,看看我是否可以获得更成功的匹配。 截止前的图像:
图片后来被切断:
但是我的计算时间有问题。我的代码需要很高的计算成本,有时程序会失败。错误显示“Segmentation fault:11”。 如果我退出waitKey()行,则会出现“总线错误10”。 我在第二个中复制主要图像内容的代码是:
> for (int i=0; i<RightEpipolarLines.rows; i++) {
> float m = -RightEpipolarLines(i, 0)/RightEpipolarLines(i, 1);
> float n = -RightEpipolarLines(i, 2)/RightEpipolarLines(i, 1);
> for (int x = 0; x < 480; x++) {
> float y_prima = m*x + n;
> int y = int (y_prima);
> (cut_image[0].at<float>(y, x)) = capture[0].at<float>(y, x);
> }
>
> }
> waitKey();
> for (int i = 0; i<LeftEpipolarLines.rows; i++) {
> float m = LeftEpipolarLines(i, 0)/LeftEpipolarLines(i, 1);
> float n = -LeftEpipolarLines(i, 2)/LeftEpipolarLines(i, 1);
> for (int x = 0; x < 480; x++) {
> float y_prima = m*x + n;
> int y = int (y_prima);
> (cut_image[1].at<float>(y, x)) = capture[1].at<float>(y, x);
> }
> }
> waitKey();
有人知道如何更有效地在真实捕获和cut_image之间传递信息吗?我只想传递靠近极线的像素信息。