当我发现以下代码实际工作时,我感到非常惊讶:
std::vector<int> list /*= ...*/;
std::tr1::function<void(int)> func = ^(int i) {
return i + 1;
};
std::for_each(list.begin(), list.end(), func);
Run Code Online (Sandbox Code Playgroud)
似乎std::tr1::function能够从Objective-C块构建,但我不确定如何,因为(最后我检查过),它的实现并不专门处理块.它是否以某种方式隐含地吮吸了底层函数指针?此外,这种行为是否未定义且可能会发生变化?
我正试图检测图像上的标尺,我将按照下一个过程:
1)准备图像(模糊,Canny等)
2)检测线条
3)准备一组平行线
接下来我尝试了HoughLinesP方法,看起来我不能在我的情况下应用它,因为我不知道线的角度,所以找不到标尺垂直线,但发现水平(例如)和每个标尺线由很多细线,这将是一个需要处理的问题:

代码:
std::vector<cv::Vec4i> lines_std;
cv::HoughLinesP( grayMat, lines_std, 1, CV_PI/90, 50, 10, 0 );
// drawing lines (with random color)
for( size_t i = 0; i < lines_std.size(); i++ )
{
cv::line( originalMat, cv::Point(lines_std[i][0], lines_std[i][1]),
cv::Point(lines_std[i][2], lines_std[i][3]), cv::Scalar(arc4random_uniform(155)+100,
arc4random_uniform(155)+100,
arc4random_uniform(155)+100), 1);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了LineSegmentDetector,并且得到了更接近我期望的结果:

码:
vector<Vec4f> lines_std;
Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_NONE);
ls->detect(grayMat, lines_std);
Run Code Online (Sandbox Code Playgroud)
但在这里我遇到了一些问题(并且看起来无法自定义createLineSegmentDetector):并非所有线路都被检测到;线路检测不在中心但在侧面检测,有时仅在左侧或右侧,但我需要获得中心粗线,因为这将在下一个计算中使用.
那么,找到所有线条的正确方法是什么(每条线只有一次在粗线的中心)?
更新
尝试过HoughLines:
矢量线;
cv::HoughLines(grayMat, lines, 1, CV_PI/90, 100 , 100, 0 …Run Code Online (Sandbox Code Playgroud) 使用Objective-C++,我可以编写一个C++ IsObjectiveCClass<T>模板元函数,IsObjectiveCClass<T>::value当且仅当T是Objective-C类时才是真的吗?
从语言的C/C++子集的角度来看究竟是什么是ObjC类?在C/C++上下文中使用时,MyClass*指针似乎表现得像普通的C指针; 这是否意味着MyClass也是C类型?
我在C++中有很多代码,最初是在PC上构建的.我试图在Mac上使用Objective-C.为此,我创建了一个Objective-C框架来存放C++代码并添加了一个瘦包装器.但是我在C++代码中遇到了typedef问题.
当我在PC上使用C++时,我使用了BOOLWinDef.h中定义的变量.因此,当我将所有内容移到Mac上时,我添加了typedef int BOOL;以确保BOOL变量仍然按预期编译.
但是当我尝试编译时,我得到一个错误:" Conflicting declaration 'typedef int BOOL'".我假设这是因为BOOLObjective-C中的关键字,因此已经定义了.我也不能只使用Objective-C,BOOL因为它是一个unsigned char而不是int.
当我在寻找可能的解决方案时,我找到了一个提到未定义BOOL的解决方案,但是我找不到怎么做(我也不知道它是否真的有效). 另一个建议将 C++文件中的BOOL重命名为非关键字.这个建议对我来说不是一个选择,因为其他项目依赖于C++代码.理想情况下,我所做的任何更改都应保留在一个文件中,或者至少不应对Windows计算机上的代码产生负面影响.
如何为我的C++文件取消定义BOOL的Objective-C定义并使用我添加的C++定义?有没有更好的方法来处理这个问题?
如果它有助于我使用:Xcode 3.2.5,64位和Mac OS X 10.6.6
谢谢你的指导!
我正在使用Vuforia在图像目标上放置3D模型.我已经创建了一个适用于Android和iOS的通用C++解决方案.它适用于Android,但我无法让3D模型出现在iOS中.它完美地跟踪图像目标,但没有3D模型的迹象.我正在使用的3D模型可以在这里找到.
这就是我在做的事情:
每次需要渲染屏幕时,Vuforia都会调用此方法:
- (void)renderFrameQCAR
{
[self setFramebuffer];
[[ObjectController getInstance] getObjectInstance]->renderFrame();
[self presentFramebuffer];
}
Run Code Online (Sandbox Code Playgroud)
这是setFramebuffer方法(Objective-C++):
- (void)setFramebuffer
{
if (context) {
[EAGLContext setCurrentContext:context];
if (!defaultFramebuffer) {
[self performSelectorOnMainThread:@selector(createFramebuffer) withObject:self waitUntilDone:YES];
}
#ifdef USE_OPENGL1
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
#else
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
#endif
}
}
Run Code Online (Sandbox Code Playgroud)
这是renderFrame方法(C++):
void IDRObject::renderFrame()
{
// Clear color and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Get the state from QCAR and mark the beginning of a rendering section
QCAR::State state = QCAR::Renderer::getInstance().begin(); …Run Code Online (Sandbox Code Playgroud) 考虑以下C++方法:
class Worker{
....
private Node *node
};
void Worker::Work()
{
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(node);
hammer.Use();
}];
....
}
Run Code Online (Sandbox Code Playgroud)
在捕获"节点"时,块确切地捕获了什么?对于其他情况,块的语言规范http://clang.llvm.org/docs/BlockLanguageSpec.html是明确的:
在复合语句范围内使用的变量以正常方式绑定到块,但自动(堆栈)存储中的变量除外.因此,可以按照人们的预期访问函数和全局变量,以及静态局部变量.[考验我]
块的复合语句中引用的本地自动(堆栈)变量将作为const副本导入并捕获.
但在这里,我们是否捕获了当前的这个值?副本这个使用工人的拷贝构造函数?或者对节点存储位置的引用?
特别是,假设我们说
{
Worker fred(someNode);
fred.Work();
}
Run Code Online (Sandbox Code Playgroud)
当块运行时,对象fred可能不再存在.节点的价值是多少?(假设底层的Node对象永远存在,但是工作者来去.)
相反,我们写了
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
Run Code Online (Sandbox Code Playgroud)
结果有何不同?
我想从fbx文件中读取3d模型并openGL es 2.0在iPhone上的引擎内显示它(不使用Unity),我也想显示读取3d对象的动画.
我如何从fbx文件中获取动画?
目前我能够获得姿势名称列表,据我所知,它带有变换矩阵,图层,堆栈,图层和许多曲线中的姿势的完整列表.
如何将所有信息组合起来以显示正确的动画?
我也尝试解析其中的一些信息TakeInfo,但结果有点奇怪,例如:
FbxTakeInfo *ltakeInfo = pScene->GetTakeInfo(lAnimStack->GetName());
FbxTime start = ltakeInfo->mLocalTimeSpan.GetStart();
FbxTime end = ltakeInfo->mLocalTimeSpan.GetStop();
self.startTime = start.GetSecondDouble();
self.endTime = end.GetSecondDouble();
Run Code Online (Sandbox Code Playgroud)
在这里我得到start = 0并end = 0.014为每个解析的图层,所以我猜这是不正确的(fbx我要显示的文件包含1个网格与简单的5秒持续时间动画).
更新
经过几个小时的调查后,我接下来的事情:
作为参考,这是我想要显示的测试obj的结构:
在这里你可以看到很多骨头(更具体 - 19)我能够得到(如上所述)列表中的19个动画obj(如骨骼/ obj的名称)和每组151帧内的19组曲线(具有帧速率) 30正好5秒的动画 - 30*5 = 150 + 1最后一个单位矩阵).
如果我尝试逐个使用每个曲线组到我的网格(我只能解析1个网格)我看到网格的不同部分的动画应用于所有网格(例如垂直旋转或水平平移),所以我认为这个每组中的曲线应该精确地应用于特定骨骼,因此我将获得我的网格动画.问题是我不知道如何仅为选定的骨骼顶点部分设置动画.
现在的问题是如何应用这个所有动画分为将特定于骨的组分离到整个obj(因为我只有一个网格)?
如何从包含所有曲线组的列表中为每个帧获得1个全局曲线列表?
UPDATE2
感谢@codetiger的建议,我遵循评论中提供的链接中的指令,并且通过该技术,我能够检索具有开始和结束时间以及所需变换的骨骼特定垫片列表,但这几乎与我之前使用曲线相同 - 与曲线的唯一区别我应该从9条曲线创建mat(对于xyz进行平移/缩放/旋转)而不是使用完整矩阵,但问题仍然存在 - 如何将它们组合在1个全局矩阵中?
我使用的代码(找到几个链接):
FbxNode* modelNode = _fbxScene->GetRootNode();
FbxAMatrix geometryTransform = GetGeometryTransformation(modelNode);
for (unsigned …Run Code Online (Sandbox Code Playgroud) 如果一个人搜索混合objective-c和c ++,这个链接总是作为解决方案出现.
不幸的是它已经死了.有没有人知道这篇文章的位置,有另一篇文章,或者有一些代码演示了objective-c和c ++对象之间的双向聊天(从另一个调用两者).我可以围绕无法从c ++调用objective-c进行架构,但我更愿意自由地执行回调.
我已经实现了一个c ++对象并从objective-c ++调用它上面的方法,但我还没有弄清楚如何让c ++回调或如何在目标中正确声明c ++对象 - c ++对象的头文件.
我有一个用于网络通信的C++库,我需要为Mac移植,以前这个库是在Windows C++应用程序上使用的.
C++ Network Lib的流程基于错误情况下的异常,而不是返回错误代码或上一个错误.
现在,在Mac上,我们使用Objective-C/C++进行应用.我需要在Objective-C/C++中使用UI,但用于核心网络功能的lib是相同的C++库.
所以我的问题是目标C能够处理C++调用抛出的异常吗?如果是这样,怎么样?如果不是我如何解决它?或者我们是否编写了一个围绕C++ Lib调用的包装器并使用异常并返回错误代码?
请指教,如何解决..
我从Swift编译器收到一个奇怪的错误消息:
<unknown>:0: error: 'required' initializer 'init(arrayLiteral:)' must be provided by subclass of 'NSSet'
Foundation.NSSet:2:33: note: 'required' initializer is declared in superclass here
required public convenience init(arrayLiteral elements: Any...)
^
Run Code Online (Sandbox Code Playgroud)
请注意,我的代码都没有子类化NSSet(nor Set)。所以我不知道为什么斯威夫特认为我在做这件事,更不用说错误了。
我的项目有点特别,因为我有一些Objective-C类(通过Objective-C调用C ++代码)和一个module.map文件,可以让Swift调用C库。
编译Swift文件时发生错误(我是从几个Swift文件中获得的,但是只有其中一些使用C库,但是到目前为止,所有这些似乎都在与ObjC类进行对话)。如您所见,Swift没有错误的行号,尽管有人在继承NSSet。
有人看过吗?有谁知道如何诊断这个问题?我尝试注释掉部分代码,但似乎找不到任何有助于跟踪此问题的内容。
要强调的是:我没有做NSSet的任何子类化。我认为我什至没有在代码中使用NSSet。这就是Swift编译器似乎正在弥补的问题。
更新: 另一个问题使我想到,它可能与从Class对象实例化实例有关。我有一个Class我稍后要实例化的类:
@interface MYInfo : NSObject
@property Class myClass;
@end
Run Code Online (Sandbox Code Playgroud)
后来我使用Swift中的实例化它:
guard let myClass = info.myClass.init() as? MyClass else { return }
Run Code Online (Sandbox Code Playgroud)
如果我删除了这最后一行,错误消息就会消失。