小编Mar*_*cin的帖子

在OpenCv中使用"cv :: imread"函数读取图像的问题

我遇到了一些基本的OpenCV代码问题.这是我的代码:

 cv::Mat src;
 src=imread("Calibration.bmp",0);

 if (src.empty())
  cout << "Cannot load image" << " ";
 else
  cout << src.cols << " " << src.rows << " ";
Run Code Online (Sandbox Code Playgroud)

不幸的是,cv :: imread返回任何类型的输入图像的NULL矩阵(我试过.bmp,.jpg).文件名似乎工作正常(程序不会以错误结束),因为使用错误的文件名会生成错误消息.我尝试过使用oldstyle"CvLoadImage",但结果却一样.有谁知道如何解决这个问题?

opencv visual-studio-2008

18
推荐指数
1
解决办法
2万
查看次数

最好的圆拟合算法

我需要一个非常精确的算法来将圆拟合到数据点集(实际上我需要确定中心).数据在图像的二值化和分割之后出现.我尝试了简单的质心和加权质心算法以及预制的OpenCv :: fitEllipse函数.我已经从OpenCV函数中获得了最好的结果,但仍然不够准确.当中心锚定在子像素区域时,结果显着受损.即使在处理模型化数据时,我获得的准确性也是不够的,这是不好的,因为最终,程序将不得不处理由相机捕获的数据.您有什么建议我应该寻找什么样的算法,或者您有任何现成的解决方案吗?我宁愿不要连接任何外部库.谢谢你的帮助. 替代文字

编辑:校准目标可以在视野的任何区域进行定位.以下是我使用OpenCV程序获得的最佳结果:

169,367 748,345  
167,557 820,788  
165,690 893,158  
164,047 965,197  
162,715 1036,729  
161,575 1108,089  
160,477 1179,552  
233,297 1015,313  
232,076 1086,965  
220,359 1229,578  
268,494 1160,275  
339,544 1162,980  
362,017 1235,669  
433,390 1238,491  
482,754 1168,299  
505,233 1241,039  
554,856 1170,664  
577,302 1243,439  
627,331 1172,795  
649,507 1245,665  
713,572 588,896  
711,995 661,853  
710,440 735,034  
708,722 808,856  
707,018 882,674  
705,377 956,169  
703,609 1029,211  
701,716 1101,950  
699,760 1174,689  
721,895 1247,620  
785,829 614,754  
784,344 687,750  
782,819 761,315  
781,292 835,225  
779,389 908,975  
777,619 982,335  
775,688 1055,275  
773,672 1128,091 …
Run Code Online (Sandbox Code Playgroud)

geometry image-processing computer-vision

13
推荐指数
1
解决办法
1万
查看次数

在 Qt C++ 中处理鼠标事件

抱歉我的初学者问题...定义当 MousePressEvent 或 MouseReleaseEvent 发生时执行的过程的最简单方法是什么?

现在我正在定义自己的类(MyGraphicsView 类),它继承 QGraphicsView 并且我正在重新实现鼠标事件(它们是虚函数)。它工作得很好,但是有什么方法可以解决这个问题而不需要定义一个新的类吗?我可以以某种方式将事件与老虎机连接起来吗?

感谢您的帮助。

c++ qt qt4 qgraphicsview

5
推荐指数
1
解决办法
1万
查看次数

如何从像素坐标计算归一化图像坐标?

我需要从相应的图像点计算3D点。此处说明了执行此操作的算法:http : //en.wikipedia.org/wiki/Essential_matrix。它对我不起作用,我收到错误的结果。1.程序利用“归一化图像坐标”-如何计算它们?2. R和T矩阵(根据基本矩阵计算)与cv :: stereocalibrate程序输出的矩阵相同吗?

这就是我现在正在做的:

  1. 立体声校准我的设置
  2. 两个相机的逆相机矩阵
  3. 计算两个相机对应点的归一化坐标-通过相乘逆相机矩阵和同质像素点坐标

其余操作基于本文http://en.wikipedia.org/wiki/Essential_matrix中的部分:相应图像点的3D点

  1. 使用旋转和平移矩阵(通过立体校准程序获得)计算该点的x3物理/真实世界坐标。
  2. 计算本文编写的x1和x2坐标

谢谢你的帮助。

opencv computer-vision

5
推荐指数
1
解决办法
8374
查看次数

使用任意已知几何关系计算单应矩阵

我正在将OpenCV用于光学测量系统。我需要在数码相机拍摄的两个图像之间进行透视转换。在摄像机的视野中,我放置了一组标记(它们位于同一平面上),它们用作两个图像中的对应点。使用标记的位置,我可以计算出单应矩阵。问题在于,我实际上要转换其图像的被测对象与标记之间的距离很小,并且与标记的平面平行。我可以测量这个距离。

我的问题是,在计算单应矩阵时如何考虑该距离,这是执行透视变换所必需的。

在我的解决方案中,强烈要求不要使用测得的目标点来计算单应性(这就是为什么我在视场中需要其他标记)。

如果描述不准确,请告诉我。

在此处输入图片说明

图中呈现的是示例性图像。

红色矩形是被测对象。它物理上放置在圆形标记后面的一小段距离内。

我从不同相机的位置捕获对象的图像。在每次采集之间,被测对象可能会变形。我想使用圆形标记将对象的图像转换为相同的坐标。我可以测量对象与标记之间的距离,但我不知道,如何修改单应性矩阵才能在被测对象(而不是标记)上工作。

opencv measurement computer-vision homography

5
推荐指数
1
解决办法
1935
查看次数

从unsigned char*数据构造QImage

我遇到了将Image对象(使用Point Grej FlyCapture2 SDK捕获)传递给QImage对象的问题.我按功能得到一个与图像数据相关的指针:

virtual unsigned char* FlyCapture2::GetData  (   ) 
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式加载数据:

QImage::QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )
Run Code Online (Sandbox Code Playgroud)

两个Image对象的数据格式都是8位单色.BytesPerLine参数应该等于Image的宽度(我已经通过将FlyCapture2 :: Image保存到.bmp并将其加载到QImage来检查它).

你问题是从unsigned char*转换为uchar*吗?你还有其他建议吗?逐像素复制图像太慢了.

编辑:我正在将FlyCapture捕获的图像转换FlyCapture2::PIXEL_FORMAT_RGB8为:R = G = B = 8位,在PGR::SnapShot()函数内.SnapShot()返回unsigned char*const.这是我的Qt显示功能的一部分:

unsigned char *const img = PGRSystem->SnapShot();
QImage Img(img, 1024, 768, QImage::Format_RGB888);
QGraphicsScene *Scene = new QGraphicsScene();
Scene->addPixmap(QPixmap::fromImage(Img));
ui.ImageView->setScene(Scene);
ui.ImageView->fitInView(ui.ImageView->itemAt(100,100));
delete [] Scene;
Run Code Online (Sandbox Code Playgroud)

我也尝试将Img保存到文件中,但是后来遇到了未处理的异常.我尝试过其他像素格式对(FlyCapture2::PIXEL_FORMAT_RGB- 24位RGB与QImage::RGB888和FlyCapture2::PIXEL_FORMAT_RGBU32QImage::RGB32)

还值得一提的是,我正在使用的QImage构造器没有设置colorTable(我在检查QImage是否为grayScale时遇到异常).我想我还需要一些帮助.

qt data-capture qimage

4
推荐指数
1
解决办法
8289
查看次数

Levenberg-Marquardt算法的局限性

我使用Levenberg-Marquardt算法来最小化6个参数的非线性函数.每次最小化我有大约50个数据点,但是我得不到足够准确的结果.我的参数相差几个数量级的事实是否非常重要?如果是,我应该在哪里寻找解决方案?如果不是,您在工作中遇到的LMA有哪些限制(可能有助于找到我的应用中的其他问题)?非常感谢您的帮助.

编辑:我想解决的问题是确定最佳转换T:

typedef struct 
{
    double x_translation, y_translation, z_translation; 
    double x_rotation, y_rotation, z_rotation;
} transform_3D;
Run Code Online (Sandbox Code Playgroud)

使3D点集合适合3D线条.详细地说,我有一组3D点的坐标和相应3D线的方程,这些坐标应该通过这些点(在理想情况下).LMA正在最小化变换的3D点到相应的3D线的距离的总和.变换函数如下:

cv::Point3d Geometry::transformation_3D(cv::Point3d point, transform_3D transformation)
{
    cv::Point3d p_odd,p_even;

    //rotation x
    p_odd.x=point.x;
    p_odd.y=point.y*cos(transformation.x_rotation)-point.z*sin(transformation.x_rotation); 
    p_odd.z=point.y*sin(transformation.x_rotation)+point.z*cos(transformation.x_rotation);

    //rotation y
    p_even.x=p_odd.z*sin(transformation.y_rotation)+p_odd.x*cos(transformation.y_rotation);
    p_even.y=p_odd.y;
    p_even.z=p_odd.z*cos(transformation.y_rotation)-p_odd.x*sin(transformation.y_rotation);

    //rotation z
    p_odd.x=p_even.x*cos(transformation.z_rotation)-p_even.y*sin(transformation.z_rotation);
    p_odd.y=p_even.x*sin(transformation.z_rotation)+p_even.y*cos(transformation.z_rotation);
    p_odd.z=p_even.z;

    //translation
    p_even.x=p_odd.x+transformation.x_translation;
    p_even.y=p_odd.y+transformation.y_translation;
    p_even.z=p_odd.z+transformation.z_translation;

    return p_even;
}
Run Code Online (Sandbox Code Playgroud)

希望这个解释会有所帮助......

EDIT2:

一些示例性数据粘贴在下面.3D线由中心点和方向矢量描述.所有线的中心点都是(0,0,0),每个矢量的'uz'坐标等于1.方向矢量的'ux'坐标集:

-1.0986, -1.0986, -1.0986,
-1.0986, -1.0990, -1.0986,
-1.0986, -1.0986, -0.9995,
-0.9996, -0.9996, -0.9995,
-0.9995, -0.9995, -0.9996,
-0.9003, -0.9003, -0.9004,
-0.9003, -0.9003, -0.9003,
-0.9003, -0.9003, -0.8011,
-0.7020, -0.7019, -0.6028,
-0.5035, -0.5037, …
Run Code Online (Sandbox Code Playgroud)

math optimization nonlinear-functions levenberg-marquardt

3
推荐指数
1
解决办法
3926
查看次数