正如标题所说,我想通过使用相邻像素的叉积来计算给定深度图像的表面法线.我想使用Opencv并避免使用PCL,但是我并不真正理解这个过程,因为我的知识在这个主题上非常有限.因此,如果有人可以提供一些提示,我将不胜感激.这里要提到的是除了深度图像和相应的rgb图像之外我没有任何其他信息,所以没有K相机矩阵信息.
因此,假设我们有以下深度图像:
并且我想在相应的点找到具有相应深度值的法向量,如下图所示:
如何使用相邻像素的叉积来做到这一点?我不介意法线是否高度准确.
谢谢.
更新:
好吧,我试图关注@ timday的答案并将他的代码移植到Opencv.使用以下代码:
Mat depth = <my_depth_image> of type CV_32FC1
Mat normals(depth.size(), CV_32FC3);
for(int x = 0; x < depth.rows; ++x)
{
for(int y = 0; y < depth.cols; ++y)
{
float dzdx = (depth.at<float>(x+1, y) - depth.at<float>(x-1, y)) / 2.0;
float dzdy = (depth.at<float>(x, y+1) - depth.at<float>(x, y-1)) / 2.0;
Vec3f d(-dzdx, -dzdy, 1.0f);
Vec3f n = normalize(d);
normals.at<Vec3f>(x, y) = n;
}
}
imshow("depth", depth / 255);
imshow("normals", normals);
Run Code Online (Sandbox Code Playgroud)
我得到正确的结果如下(我不得不更换double …
我试图从github 编译这个项目,它是用C++实现的SIMD内在函数(SSE4.1).github中的项目是作为Visual Studio解决方案提供的,但我尝试使用cmake在Qtcreator中移植它.当我尝试编译它时,我收到以下错误:
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include/smmintrin.h:520:1: error: inlining failed in call to always_inline '__m128i _mm_cvtepu8_epi32(__m128i)': target specific option mismatch
_mm_cvtepu8_epi32 (__m128i __X)
Run Code Online (Sandbox Code Playgroud)
我确信它与SSE优化部分做的,但因为我不是那么熟悉这个问题我真的不知道这意味着什么,我怎么能解决这个问题,并在我搜索我真的无法网得到有用的东西.产生以下问题的代码如下:
static void cvt8u32f(const Mat& src, Mat& dest, const float amp)
{
const int imsize = src.size().area()/8;
const int nn = src.size().area()- imsize*8 ;
uchar* s = (uchar*)src.ptr(0);
float* d = dest.ptr<float>(0);
const __m128 mamp = _mm_set_ps1(amp);
const __m128i zero = _mm_setzero_si128();
for(int i=imsize;i--;)
{
__m128i s1 = _mm_loadl_epi64((__m128i*)s);
_mm_store_ps(d,_mm_mul_ps(mamp,_mm_cvtepi32_ps(_mm_cvtepu8_epi32(s1))));
_mm_store_ps(d+4,_mm_mul_ps(mamp,_mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(s1,4)))));
s+=8;
d+=8;
}
for(int i=0;i<nn;i++)
{
*d …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到以下问题的解决方案,但尚不清楚如何解决。想象一下,我在空间中有以下几点,如下图所示:
如果我认为我唯一已知的信息是点位置及其法线,我想确定两个点(将第一个点的位置视为参考)是否彼此面对。例如从点以上图像a,b,c,d和e我有:
点a面对点c,e但不是点b和d。
点b面对点d,e但不是点a和c。
点c面对点a而不是点b,d和e。
点d面对点b,e但不是点a和c。
最后
点e面点a,b和d而不是点c。
我的第一个虽然是通过使用这里提出的解决方案来处理每对的两个法向量之间的带符号角,但这对某些对有效,而对其他对无效。关于两点彼此面对的想法是,如果我们将一个点视为原点,那么如果另一个点在原点的 180 度视场内并且其法向量向内(有点“朝向”)原点。
任何有帮助的想法。
谢谢。
更新:
尝试更清楚一点并回答下面的一些评论。原则上,它在空间中的点对应于人脸的质心。但是,我事先没有这些信息(即每个点对应于面的中心,或面及其顶点的列表)。所以在更高的层次上,如果我们处理人脸,问题将是如何确定两个人脸是否彼此可见,但正如我所说,我现在拥有的唯一信息是空间中的实际点及其法线.
样本点:
a = …Run Code Online (Sandbox Code Playgroud)