OpenCV.NET,OpenCVSharp和EmguCV有什么区别?
它们源自OpenCV.
那么,他们的设计,实施和应用理念有何不同?
如您所知,OpenCV是一个非常有用的库,可以让您在计算机视觉中做出惊人而强大的功能.所以,我通过一个很好的时间弄清楚如何使用它在Unity3d,我有很多的问题,并在网络搜索,我发现了几个建议,但没有一个为我工作.
我校准了相机并找到了内在参数(K).我也计算了基本矩阵(F).
现在E = K_T*F*K. 到现在为止还挺好.
现在我们将基本矩阵(E)传递给SVD,使用分解值(U,W,V)来提取旋转和平移:
essentialMatrix = K.Transpose().Mul(fund).Mul(K);
CvInvoke.cvSVD(essentialMatrix, wMatrix, uMatrix, vMatrix, Emgu.CV.CvEnum.SVD_TYPE.CV_SVD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)
**问题)此时,已经提出了两种方法,并且让我感到困惑的是哪一种方法确实给出了正确的答案 - 特别是对于翻译:
首先输入链接描述,作者建议计算R,T如下:
但在第二种方法[ http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf]中,作者为T提供了另一个公式,即+ U,-U,如下所示:
我正在使用openCv库在C#.Net上实现它.谁知道哪个翻译公式是正确的?
我正在使用OpenCVSharp,但目前我的一半代码在C中,另一半在C++ API中,我试图将它全部移植到C++版本以避免弃用的API以及避免加载图像两次(分享Mat
而不是每个图像一个Mat
和一个CvMat
)
这是我的代码:
CvMat distortion = new CvMat(8, 1, MatrixType.F64C1);
distortion[0, 0] = camera.CameraConfig.k1;
distortion[1, 0] = camera.CameraConfig.k2;
distortion[2, 0] = camera.CameraConfig.p1;
distortion[3, 0] = camera.CameraConfig.p2;
distortion[4, 0] = camera.CameraConfig.k3;
distortion[5, 0] = 0;
distortion[6, 0] = 0;
distortion[7, 0] = 0;
CvMat intrinsic = new CvMat(3, 3, MatrixType.F32C1);
intrinsic[0, 0] = camera.CameraConfig.fx;
intrinsic[0, 1] = camera.CameraConfig.skew;
intrinsic[0, 2] = camera.CameraConfig.cx;
intrinsic[1, 0] = 0;
intrinsic[1, 1] = camera.CameraConfig.fy;
intrinsic[1, 2] = camera.CameraConfig.cy;
intrinsic[2, …
Run Code Online (Sandbox Code Playgroud) 首先,我试过这个,
public static Bitmap MatToBitmap(Mat mat)
{
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
}
Run Code Online (Sandbox Code Playgroud)
那么,我试过这个,
public static Bitmap MatToBitmap(Mat mat)
{
mat.ConvertTo(mat, MatType.CV_8U);
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
}
Run Code Online (Sandbox Code Playgroud)
图像完全是黑色的,
public static Bitmap ConvertMatToBitmap(Mat matToConvert)
{
return new Bitmap(matToConvert.Cols, matToConvert.Rows, 4*matToConvert.Rows, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, matToConvert.Data);
}
Run Code Online (Sandbox Code Playgroud)
这也不起作用.
我只想预览然后从 WinForms C# 应用程序中的设备摄像头(网络摄像头)捕获快照。
我用过这个:WebEye WebCameraControl,但它似乎在某些机器/相机上失败。描述暗示有更多的负载,但我在 NuGet 上找不到任何适用于 WinForms 的内容。
有什么建议吗?我觉得我错过了一些明显的东西,比如一个可以做到这一点的内置 Windows 控件!
我已经在这个项目上工作了几个月,我正在尝试使用OpenCVSharp将眼睛跟踪整合到Unity中.我已经设法让一切工作,包括实际跟踪瞳孔等,但我有内存泄漏.基本上在程序运行20-30秒后冻结并且控制台错误说"无法分配(这里插入数字)位".在查看程序运行期间的内存使用情况后,您可以看到它的使用情况稳步攀升,直至最大化然后崩溃.
现在我花了很长时间试图解决这个问题,并阅读了很多关于正确发布图像/存储等的帮助帖子.尽管事实上我正在这样做,但它似乎并未正确释放它们.我尝试使用垃圾收集器强制它回收内存,但这似乎也没有用.我只是对图像做了一些根本性的错误以及我如何回收它们?或者每帧都创建新图像(即使我正在释放它们)导致问题.
任何帮助将不胜感激.这是下面的代码,您可以忽略更新功能中的许多内容,因为它与实际跟踪部分和校准有关.我意识到代码非常混乱,抱歉!需要担心的主要部分是EyeDetection().
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using OpenCvSharp;
using OpenCvSharp.Blob;
//using System.Xml;
//using System.Threading;
//using AForge;
//using OpenCvSharp.Extensions;
//using System.Windows.Media;
//using System.Windows.Media.Imaging;
public class CaptureScript2 : MonoBehaviour
{
//public GameObject planeObj;
public WebCamTexture webcamTexture; //Texture retrieved from the webcam
//public Texture2D texImage; //Texture to apply to plane
public string deviceName;
private int devId = 1;
private int imWidth = 800; //camera width
private int imHeight = 600; //camera height
private string errorMsg = "No errors …
Run Code Online (Sandbox Code Playgroud) 已添加问题以增加清晰度
我正在使用OpenCV来尝试校准激光扫描仪.
我有一组由扫描仪捕获的2d点.为了举例,我们让这些点表示如下:
IMAGE POINTS
{(0.08017784, -0.08993121, 0)}
{(-0.1127666, -0.08712908, 0)}
{(-0.1117229, 0.1782855, 0)}
{(0.09053531, 0.198439, 0)}
Run Code Online (Sandbox Code Playgroud)
我知道这些点对应于以下现实世界点:
OBJECT POINTS
{(0, 0, 0)}
{(190, 0, 0)}
{(190, 260, 0)}
{(0, 260, 122)}
Run Code Online (Sandbox Code Playgroud)
我一直在使用OpenCV来解决旋转和平移矩阵,它允许我给出一个世界点(例如100,200,20)并在捕获的坐标系中返回2d点.
到目前为止,我的结果表明,如果物点是共面的,那么OpenCV几乎可以完美地找到旋转/平移结果.
但是,在我上面给出的例子中,并非所有点都在同一个平面上的问题,我得到的答案非常错误.
我知道这是可能的(不一定是openCV)因为我有另一个可以做到这一点的商业软件.作为参考,上述问题的解决方案是矩阵:
SOLUTION
[-0.99668, 0.03056, 0.07543]
[ 0.05860, 0.91263, 0.40454]
[-0.05647, 0.40762,-0.91140]
[79.34385, -89.63855,-982.25938]
Run Code Online (Sandbox Code Playgroud)
我使用均方根误差来确定结果的有效性.我提供的解决方案的均方根误差是1.61560.虽然OpenCV的结果超过了1000.
问题:
使用给定的图像点和对象点如何使用OpenCV(或其他方法)来获得解决方案.
我已经尝试过的:
我从OpenCV尝试过基本的SolvePNP,如下所示:
Cv2.SolvePnP(objectPoints, imagePoints, camMatrix, dist, out double[] rvec, out double[] tvec, false, SolvePnPFlags.Iterative);
Run Code Online (Sandbox Code Playgroud)
如上所述,如果我的对象点都是平面的,则此解决方案有效.但是对于其他平面上的点,解决方案会崩溃并且非常错误.
提前致谢!
我有点卡在这个:
我试图将两个 OpenCvSharp.Points 制作的矩形转换为 System.Drawing.Rectangle。
我在 OpenCvSharp 中发现了一个有趣的区域,我想将此区域保存为一个新的位图,以显示在 PictureBox 或其他东西中。
public static Mat Detect(string filename)
{
var cfg = "4000.cfg";
var model = "4000.weights"; //YOLOv2 544x544
var threshold = 0.3;
var mat = Cv2.ImRead(filename);
var w = mat.Width;
var h = mat.Height;
var blob = CvDnn.BlobFromImage(mat, 1 / 255.0, new OpenCvSharp.Size(416, 416), new Scalar(), true, false);
var net = CvDnn.ReadNetFromDarknet(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, cfg), Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, model));
net.SetInput(blob, "data");
Stopwatch sw = new Stopwatch();
sw.Start();
var prob = net.Forward(); // Process NeuralNet
sw.Stop();
Console.WriteLine($"Runtime:{sw.ElapsedMilliseconds} …
Run Code Online (Sandbox Code Playgroud)作为硕士论文的一部分,我正在探索Structure From Motion.在阅读了H&Z书的部分内容后,通过在线教程和阅读了很多SO帖子,我得到了一些有用的结果,但我也遇到了一些问题.我正在使用OpenCVSharp包装器.所有图像都使用相同的相机拍摄.
我现在拥有的:
首先,我计算初始的3d点坐标.我这样做是为了这些步骤:
使用相机内在函数获取Essential矩阵(此时我使用预定的内在函数)并对其进行分解:
Mat essential = camera_matrix.T() * fundamentalMatrix * camera_matrix;
SVD decomp = new SVD(essential, OpenCvSharp.SVDFlag.ModifyA);
Mat diag = new Mat(3, 3, MatType.CV_64FC1, new double[] {
1.0D, 0.0D, 0.0D,
0.0D, 1.0D, 0.0D,
0.0D, 0.0D, 0.0D
});
Mat Er = decomp.U * diag * decomp.Vt;
SVD svd = new SVD(Er, OpenCvSharp.SVDFlag.ModifyA);
Mat W = new Mat(3, 3, MatType.CV_64FC1, new double[] {
0.0D, -1.0D, 0.0D,
1.0D, 0.0D, 0.0D,
0.0D, 0.0D, 1.0D
}); …
Run Code Online (Sandbox Code Playgroud)I am trying to find image occurences inside an image. I have written the following code to get a single match using OpenCVSharp3:
Mat src = OpenCvSharp.Extensions.BitmapConverter.ToMat(Resources.all);
Mat template = OpenCvSharp.Extensions.BitmapConverter.ToMat(Resources.img);
Mat result = src.MatchTemplate(template, TemplateMatchModes.CCoeffNormed);
double minVal, maxVal;
OpenCvSharp.Point minLoc, maxLoc;
result.MinMaxLoc(out minVal, out maxVal, out minLoc, out maxLoc);
Console.WriteLine("maxLoc: {0}, maxVal: {1}", maxLoc, maxVal);
Run Code Online (Sandbox Code Playgroud)
How can I get more matches based on a threshold value?
Thank you!
我试图理解代码是如何运作的,因为这一部分无法理解一个非常重要的部分.你能解释一下当我们使用*x而不是x时,浮动*意味着什么以及它有何不同?
为什么f1 anf f2的值在每次迭代后都会发生变化?是因为IplImages [0]和IplImages [1] .toPointer?请解释.
List<IplImage> IplImages;
float* f1 = (float*)IplImages[0].ImageData.ToPointer();
float* f2 = (float*)IplImages[1].ImageData.ToPointer();
.
.
.
.
if (*(f2 + row * imageWidth) > m)
{
m = *(f2 + row * imageWidth);
.....
}
Run Code Online (Sandbox Code Playgroud)