c++转换位包装int * * MATLAB unisgned char mxArray使用墨西哥人吗?

2视图(30天)
你好,
有人能帮我失去我的心灵在确定这里是错的…我有一个c++数组的int值( int * * pColors -从Kinect SDK提供网- >色鬼&pColors电话- 但这不该IMHO)这只是三胞胎的字节大小的0 - 255 (0 xff) rgb颜色值(这工作,可以读/打开好c++),我现在想读到并使用MATLAB作为mxArray将结构的一部分,还持有的coresponding顶点数量这些coresponding rgb颜色每个(所以顶点的数量等于数量的颜色。 numVertices = numColors )…我什么都试过漂亮的多,几乎不失败和/或降低了MATLAB(毫无疑问,我试图访问的部分内存不保留)。
这是我用来创建一个 颜色 mxArray存储有效的c++数据(我可以阅读和打开它好一些c++代码):
intcolorsIndSize [2] = {1, numColors};
颜色= mxCreateNumericArray (3 colorsIndSize mxUINT8_CLASS mxREAL);
但之后,我不得不使用这一个c++指针用于我的墨西哥人代码( mxGetPr 而不是 mxGetUint8s 因为我不能使用“-R2018a”继承了大量的代码和添加,很多错误):
无符号char * colorsptr = (unsigned char *) mxGetPr(颜色);
所以现在遍历一个真正的c++数据和存储的 颜色 mxArray使用 corolsptr 指针(待符合coresponding vertexIndex)我使用:
(unsigned int t = 0, vertexIndex = 0;t < numVertices / 3;+ + t, vertexIndex + +)墨西哥人
{
unsigned int color0 = pColors [vertexIndex];
如果(color0 > 0) mexPrintf (“发现一个? \ n”);
colorsptr (t * 3) = ((color0 > > 16) & 0 xff);
colorsptr (t * 3 + 1) = ((color0 > > 8) & 0 xff);
colorsptr [t * 3 + 2] = (color0 & 0 xff);
}
但这只是不会给我结果(只是挂着,似乎开始写出一些mexPrintf一旦但我从未看到现在完成)……我也试过其他维度的值大小和我不能找出是什么问题…谁能请帮助?
也许我应该专注于通过Visual Studio调试,但我现在不能附着在MATLAB程序出于某种原因,尽管我试过了,也许我只是不理解指针的算术mxArray什么 mxCreateNumericArray 创建和如何访问它的物品通过添加和乘法,或者是使用无符号字符代替uint8我认为是相同的大小做坏事?
蒂雅
注:
一度我用各种大小和遍历选项并得到一个输出代码等问题却疯狂的大小 3 x numVertices x 129 (我不明白我怎么能得到129如果这应该是8位颜色)……虽然当时穿越三种颜色代码变体一样一些适用于c++的原始代码,但在这种情况下我刚刚即使是一个简单的 1 x (numVertices * 3) 3 x numVertices 已打开的颜色从c++ int * *数组。

接受的答案

詹姆斯Tursa
詹姆斯Tursa 2019年6月9日
编辑:詹姆斯Tursa 2019年6月9日
一些问题:
1)mxCreateNumericArray根据医生的签名是:
mxArray* mxCreateNumericArray (mwSize ndim, const mwSize *会变暗,
mxClassIDclassid,mxComplexityComplexFlag);
所以你为什么使用int,第二个参数时应该mwSize ?这可能是一个4字节和8字节整数大小不匹配。很容易崩溃的原因。
2)这段代码:
intcolorsIndSize [2] = {1, numColors};
颜色= mxCreateNumericArray (3 colorsIndSize mxUINT8_CLASS mxREAL);
colorsIndSize数组有两个元素,但是在第二行你告诉mxCreateNumericArray它有三个元素。这将导致mxCreateNumericArray读出数组的末尾到无效的内存中。这也容易导致崩溃。取代它可你可能意味着:
mwSizecolorsIndSize [2] = {3 numColors};/ /改变了13,int, mwSize
颜色= mxCreateNumericArray (2 colorsIndSize mxUINT8_CLASS mxREAL);/ /改变了32
3)我困惑。你不止一次提到c++ int * *数组,但我没有看到任何这样的事在你的代码。pColors的定义究竟是什么?
4)numColors等于numVertices / 3 ?如果不是那么你有另一个问题。
3评论
德扬迪米特里
德扬迪米特里 2019年6月10日
编辑:德扬迪米特里 2019年6月10日
谢谢你的帮助,下面是一些代码,当前版本未完成…一个注意的使用首先,你需要KinectV2 SDK和.xef录音(或KinectV2流数据处理开始的过程。m文件中发现的zip根——我明天还可以提供.xef Kinect工作室和没有使用Kinect传感器本身,但因为它不会小,即使是1秒记录可能需要一段时间先找个地方主机)。
它还使用编译的墨西哥人第一次(可以作为我没有SDK包括一些原始的微软的dll的zip) ....
我注意到今天,基本上是相同的代码时使用MATLAB环境之外的但在VS2019作为一个命令行编译. exe没问题,色鬼&pColors电话得到const int * *颜色收集好并在MATLAB在某种程度上没有,所以我现在的猜测,也许我从一些biolerplate代码Kin2项目责任(这类处理和维护模板化的代码我没有费心去看甚至直到现在,但也许我应该因为它没有颜色网格数据代码)或MATLAB本身无法处理int * *(我怀疑)或者是返回的数据执行之后才释放内存(但我不认为也没有被打印出来同时KF_getMesh MATLAB函数工作但我一遍又一遍地说:11111111 00000000 11111111 00000000为每个顶点/颜色)。
蒂雅

登录置评。

更多的答案(2)

德扬迪米特里
德扬迪米特里 2019年6月10日
编辑:德扬迪米特里 2019年6月10日
只是一个后续的一个小问题,如何用MATLAB c++运行,和治疗类型相比…我已经确认我得到零,我从来不会让其他0 - 255颜色值……我做过手动拆包和写作的所有部分的颜色值我接到从那色鬼SDK电话返回int * * pColors……但是(即使我现在肯定里面有什么在最后一次的阅读基本上是一群11111111 00000000 11111111 00000000 - 24因此0)然而我一直能够编写一些非零值在使用UINT8像当使用以外的其他东西 颜色= mxCreateDoubleMatrix (3 numColors mxREAL); 这将给我一些随机非零值在某种程度上(尽管在这种情况下我觉得我只是迷途的jiberish,虽然我猜64位,因为它只是填满,直到相当于mxArray但有不可重复的值,甚至是陌生人对我更加困惑如何正确访问mxArray项目),我不知道为什么使用 unsigned char * colorsptr = (unsigned char *) mxGetPr(颜色); 结合上述mxArray是任何不同当使用UINT8 mxArray代码…在which case colors definition above gives me all-0s (which probably is true as I've printed it out to see what I'm reading from the getColors set values...maybe MATLAB isn't able to set that although when running more or less the same C++ code works and it prints out regular color values, unlike in MATLAB when everything else gives me 0, including that mexPrintf of the manually shifted pColor[vertexIndex] values)?
TIA再次
注:陌生人我已经能够阅读顶点,法线和三角形顶点指数好虽然从这个Kinect SDK代码运行通过MATLAB的墨西哥人,不是颜色,工作之外……
2的评论
德扬迪米特里
德扬迪米特里 2019年6月10日
编辑:德扬迪米特里 2019年6月10日
是的,工作,在普通的c++,传入&pColors然后,色鬼SDK方法。我附加了一些代码来评论上面仍然是一个进展中的工作所以请不要法官过度使用布尔值检查,甚至试图让它工作在多个调用第一个失败……只有绝望…等。

登录置评。


德扬迪米特里
德扬迪米特里 2019年6月14日
编辑:德扬迪米特里 2019年6月15日
你好,詹姆斯,
希望你还是现在....现在的样板代码我已经习惯了 Kin2 Kinect MATLAB工具箱项目我真的不能告诉什么问题了,我不能得到任何比零值完全相同的代码编译和运行时的颜色以外的MATLAB没问题…也许是真的与MATLAB无法分配const int * *值通过一个参考或其他外部可能(可能是微软的Kinect v2 SDK代码有错误但为什么工作那么以外的MATLAB .mex作为一个独立的. exe吗?)
我已经包括了这个简单的代码示例和删除一个使用样板代码,我认为可能是负责的行为(因为以前版本及其调用将正如Kin2融合演示只工作一次和崩溃MATLAB第二次我虽然内存泄漏可能造成一些影响色鬼……结果证明是我错了……现在它仍然给了我零值即使没有取出样板代码是只让墨西哥人使用函数调用类- >方法等)。
如果你或其他任何人有任何想法(我会试着联系Kin2框架也看到作者为什么不他们在Kinect融合包括颜色网格数据演示)我会很感激……我怀疑包装色鬼在c++代码()方法返回什么将只剩下另一个尝试……但我怀疑我将得到另一个结果返回的0色鬼最初只是包装到另一个对象而不影响返回0年代的错误呢?
最好的致意和蒂雅,
D。
注:
代码还包括K3d4的一个更简单的版本,称为K3d4a cpp文件。使用compile_cpp_a cpp(编译。m MATLAB脚本),假设是上面包装器代码的开始但不工作因为我忘了拿出来一些,在第97行,更换旧4结构体成员只有1 plhs [0] = mxCreateStructArray (2 dim field_names);…
2的评论
德扬迪米特里
德扬迪米特里 2019年6月15日
编辑:德扬迪米特里 2019年6月20日
最初的崩溃问题已经解决用詹姆斯的建议mxCreateNumericArray降低值,然而新的问题是(虽然现在看似无关,但我认为这可能是相关上周在某种程度上),该方法从Kinect 2 SDK是根据微软写的,可以使用c++ / C不是返回相同的值,当它工作时作为一个独立的. exe编译VS2017…我不想做一个新问题相关的两个问题可能是和上面的问题可以给更多的上下文,但这不是我了 新的一个 (如果需要关注和回答的MVP)……另外如果有bugzilla我想报告可能MATLAB错误我目前看到没有其他原因. zip中的代码上面提供好工作作为一个独立的. exe但.mex(或错误的推理)吗?

登录置评。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!