我遇到了一些基本的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 :: 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) 抱歉我的初学者问题...定义当 MousePressEvent 或 MouseReleaseEvent 发生时执行的过程的最简单方法是什么?
现在我正在定义自己的类(MyGraphicsView 类),它继承 QGraphicsView 并且我正在重新实现鼠标事件(它们是虚函数)。它工作得很好,但是有什么方法可以解决这个问题而不需要定义一个新的类吗?我可以以某种方式将事件与老虎机连接起来吗?
感谢您的帮助。
我需要从相应的图像点计算3D点。此处说明了执行此操作的算法:http : //en.wikipedia.org/wiki/Essential_matrix。它对我不起作用,我收到错误的结果。1.程序利用“归一化图像坐标”-如何计算它们?2. R和T矩阵(根据基本矩阵计算)与cv :: stereocalibrate程序输出的矩阵相同吗?
这就是我现在正在做的:
其余操作基于本文http://en.wikipedia.org/wiki/Essential_matrix中的部分:相应图像点的3D点
谢谢你的帮助。
我正在将OpenCV用于光学测量系统。我需要在数码相机拍摄的两个图像之间进行透视转换。在摄像机的视野中,我放置了一组标记(它们位于同一平面上),它们用作两个图像中的对应点。使用标记的位置,我可以计算出单应矩阵。问题在于,我实际上要转换其图像的被测对象与标记之间的距离很小,并且与标记的平面平行。我可以测量这个距离。
我的问题是,在计算单应矩阵时如何考虑该距离,这是执行透视变换所必需的。
在我的解决方案中,强烈要求不要使用测得的目标点来计算单应性(这就是为什么我在视场中需要其他标记)。
如果描述不准确,请告诉我。
图中呈现的是示例性图像。
红色矩形是被测对象。它物理上放置在圆形标记后面的一小段距离内。
我从不同相机的位置捕获对象的图像。在每次采集之间,被测对象可能会变形。我想使用圆形标记将对象的图像转换为相同的坐标。我可以测量对象与标记之间的距离,但我不知道,如何修改单应性矩阵才能在被测对象(而不是标记)上工作。
我遇到了将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::RGB88
8和FlyCapture2::PIXEL_FORMAT_RGBU32
带QImage::RGB32
)
还值得一提的是,我正在使用的QImage构造器没有设置colorTable(我在检查QImage是否为grayScale时遇到异常).我想我还需要一些帮助.
我使用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) opencv ×3
qt ×2
c++ ×1
data-capture ×1
geometry ×1
homography ×1
math ×1
measurement ×1
optimization ×1
qimage ×1
qt4 ×1