小编bre*_*att的帖子

使用Camera2 API的低FPS

我使用新的camera2 api体验了低FPS率.具体来说,尽管选择了最高的FPS范围(30,30)

characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
Run Code Online (Sandbox Code Playgroud)

并设置它

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
Run Code Online (Sandbox Code Playgroud)

在我测试过的两款设备(三星S5和Xperia Z3 Compact)上,我获得了高图像分辨率的平均速率.以下是我设置的方法OnImageAvailableListener:

int format = ImageFormat.YUV_420_888;
Size largest = map.getOutputSizes(format)[0];
Log.d("Images", "sizes: " + Arrays.toString(map.getOutputSizes(format)));
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), format,
        /* maxImages */50);
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener() {

    private int  frames      = 0;
    private long initialTime = SystemClock.elapsedRealtimeNanos();

    @Override
    public void onImageAvailable(ImageReader reader) {
        reader.acquireLatestImage().close();
        frames++;
        if ((frames % 30) == 0) {
            long currentTime = SystemClock.elapsedRealtimeNanos();
            long fps = Math.round(frames * 1e9 / (currentTime - initialTime));
            Log.d("Image", "frame# : " + frames …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

7
推荐指数
1
解决办法
3209
查看次数

比较std :: tuple_element和decltype(std :: get)时std :: is_same返回false

我找不到类似的问题...

我认为有两种“简单”的方法可以在编译时获取元组的第I个元素的类型(如果我错了,请纠正我):

  • using TI1 = typename std::tuple_element<I, Tuple>::type;
  • using TI2 = decltype(std::get<I>(Tuple{}));

实际上,如果我们通过分别打印这些类型typeid(...).name(),则它们将返回相同的值。

但是... std::is_same当我比较这些时返回false:

现场例子

这是预期的吗?为什么?

using Tuple = std::tuple<float,double>;
constexpr size_t I = 0;
static_assert(std::is_same<typename std::tuple_element<I, Tuple>::type,
                           decltype(std::get<I>(Tuple{}))>::value, "different types" );
Run Code Online (Sandbox Code Playgroud)

c++ decltype c++14

7
推荐指数
1
解决办法
140
查看次数

C ++:强制lamba实例具有唯一的静态变量

我想创建一个生成lambda的函数,其中每个lambda都有自己的静态变量。但是,与我的想法相反,静态变量似乎在实例之间共享。例如,

#include <iostream>

auto make_lambda(){
    return [](){
        static auto count = 0;
        return count++;
    };
}

int main() {
    auto a = make_lambda();
    auto b = make_lambda();
    std::cout << &a << ", " << a() << std::endl;
    std::cout << &b << ", " << b() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

退货

0x7ffc229178df, 0
0x7ffc229178de, 1
Run Code Online (Sandbox Code Playgroud)

因此ab似乎是唯一的实例,但它们共享该静态计数。我以为我会看到并且确实希望看到类似

0x7ffc229178df, 0
0x7ffc229178de, 0
Run Code Online (Sandbox Code Playgroud)

现场演示

确保每个lambda都有自己的静态变量的最简单方法是什么?

c++ lambda c++14

7
推荐指数
2
解决办法
260
查看次数

Swig -includeall除了......

我有一个大项目,使用Swig -includeall标志似乎是有道理的.但是,有些文件我不想扩展,主要是STL库(例如矢量和列表).是否可以使用-includeall标志,但是从扩展中将某些文件列入黑名单(如矢量和列表)?

c++ swig

6
推荐指数
1
解决办法
342
查看次数

const临时类型的最佳实践

假设我正在做一个涉及创建一个我不会修改的临时对象的计算:

auto tmp = val * val;
// Do some calculations with tmp...
Run Code Online (Sandbox Code Playgroud)

此外,我不需要tmp成为左值,因为我不会接受它的地址。

在这种情况下,我应该在代码中使用哪种惯用法:

1.       auto    tmp = val * val;
2. const auto    tmp = val * val;
3. const auto &  tmp = val * val;
4.       auto && tmp = val * val;
5. const auto && tmp = val * val;
Run Code Online (Sandbox Code Playgroud)

请注意,我明确地放弃了,auto &因为这通常会导致UB。但是,我知道const auto &可以延长temp的寿命,因此在此我将其保留为一种选择。

不出所料,对于这个简单的示例,-O3无论如何都会编译为相同的代码:https : //godbolt.org/z/oXj3hd

但是在一个更复杂的示例中,我想他们不会。

我的想法是,选项3或5可能是最正确的,因为它们将保留对象的恒定性,并且将保留临时对象。

编辑:

许多人提到了一个事实,在这个简单的示例中,甚至不需要命名临时文件。那是正确的。我所追求的是关于生成临时表达式的复杂操作的建议,并将在代码中重复使用。

c++ c++14

6
推荐指数
2
解决办法
138
查看次数

Eigen:使用编译时维度检查返回对矩阵块的引用

我要问的是对这个问题的概括.具体来说,我想围绕传统的C和Fortran库制作C++ Eigen包装器,它使用2D数据结构:

[   x[0,0] ...   x[0,w-1] ]
[   u[0,0] ...   u[0,w-1] ]
[          ...            ]
[ x[c-1,0] ... x[c-1,w-1] ]
[ u[c-1,0] ... u[c-1,w-1] ]
Run Code Online (Sandbox Code Playgroud)

其中每个条目x[i,j]u[i,j]它们本身分别是size(nx1)和(mx1)的列向量.这导致一些复杂的(并且容易出错的)指针算法以及一些非常难以理解的代码.

因此,我想编写一个Eigen类,其唯一目的是尽可能简单地提取该矩阵的条目.在C++ 14中,它看起来像这样data_getter.h:

#ifndef DATA_GETTER_HEADER
#define DATA_GETTER_HEADER

#include "Eigen/Dense"

template<typename T, int n, int m, int c, int w>
class DataGetter {
public:

    /** Return a reference to the data as a matrix */
    static auto asMatrix(T *raw_ptr) {
        auto out = Eigen::Map<Eigen::Matrix<T, …
Run Code Online (Sandbox Code Playgroud)

c++ eigen eigen3

5
推荐指数
1
解决办法
532
查看次数

函数返回类型,具有不同的模板参数

我有一些C++类都具有相同的模板参数

template <typename T, size_t i>
struct A {

};

template <typename T, size_t i>
struct B : A<T,i>{

};

template <typename T, size_t i>
struct C : A<T,i>{

};
Run Code Online (Sandbox Code Playgroud)

等等.我还有一系列适用于这些类的方法.但是,问题出在返回类型中.我希望这个方法返回传入类的实例,整数递减1.例如,如果我只是重载函数,那将是这样的

template <typename T, size_t i>
A<T,i-1> func(const A<T,i> & a){

}

template <typename T, size_t i>
B<T,i-1> func(const B<T,i> & a){

}

template <typename T, size_t i>
C<T,i-1> func(const C<T,i> & a){

}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不重载每种类型的函数的情况下完成此操作?我的意思是......是否可以用单个模板化函数替换它们?所有功能的逻辑都是相同的.

我想这会是这样的

template <typename P, size_t i>
P<i-1> func( const P<i> & p ){

}
Run Code Online (Sandbox Code Playgroud)

其中 …

c++ c++11

5
推荐指数
1
解决办法
174
查看次数

在 Dockerfile 中使用控制台输出

我想使用一些控制台输出作为我的基本 docker 映像的名称。

具体来说,我有一个依赖的 docker 构建文件链,所以我试图自动化这个过程。例如,在以下场景中,一个镜像的 Dockerfilederived1依赖于基础镜像base_image_name

base_image_name/ 
    Dockerfile
    derived1/
        Dockerfile
    derived2/
        Dockerfile
Run Code Online (Sandbox Code Playgroud)

构建基础映像时,它会使用${PWD##*/}. 在这种情况下,基本图像的文件夹称为base_image_name,因此基本图像称为company:base_image_name

然后,当派生映像构建时,他们应该能够通过向上移动目录并查看该目录名称来找出基本映像的名称。因此,例如,当构建company:derived1镜像时,它应该查找一个目录,看到它被调用base_image_name,并由此推断它应该使用基础镜像company:base_image_name

我想让这个结构有几层深,所以我想自动化它。为此,我尝试了几种语法排列

FROM company:$(cd $PWD/../;  echo ${PWD##*/})
Run Code Online (Sandbox Code Playgroud)

但我似乎无法正确理解。要了解该命令$(cd $PWD/../; echo ${PWD##*/})在做什么,只需在终端中输入它即可。

echo $(cd $PWD/../;  echo ${PWD##*/})
Run Code Online (Sandbox Code Playgroud)

简单地返回上一级目录的名称。但是,当我尝试在 Dockerfile 中使用它时,出现错误

Error response from daemon: Dockerfile parse error line 1: FROM requires either one or three arguments
Run Code Online (Sandbox Code Playgroud)

有人可以为我提供正确的语法吗?

编辑:

我还尝试使用 a 构建派生图像build-arg,但这似乎也不起作用:

build.sh:

BASE=$(cd $PWD/../../; echo ${PWD##*/}) …
Run Code Online (Sandbox Code Playgroud)

docker dockerfile

5
推荐指数
1
解决办法
5276
查看次数

C ++:实例化库中的许多模板

我有一个带有大小模板化的类的库:

foo.hpp

template <size_t N>
struct Foo {
   void bar();
};
Run Code Online (Sandbox Code Playgroud)

foo.cpp

template <size_t N>
void Foo<N>::bar() {
...
};
Run Code Online (Sandbox Code Playgroud)

我希望编译后的版本对于cpp文件中定义的特定大小列表无效。用伪代码,像这样

foo.cpp

template <size_t N>
void Foo<N>::bar() {
...
};

for (const auto & size: {1,2,7,9})
    template struct Foo<size>;
Run Code Online (Sandbox Code Playgroud)

现在,我正在手动执行此操作(每种类型均无效),但这容易出错,因为我有多个文件应针对相同的大小进行定义。

我知道我可以将所有内容移动到头文件中,并使用enable_if来选择有效的大小。但是,我想隐藏实现细节。因此,目前的方法。

编辑:

FWIW,我希望避免使用宏。我认为,如果您需要一定范围的变量(例如1,2,3,4 ...),则可以进行以下操作:

template<template<size_t> class E, size_t I = 1, std::enable_if_t<I >= 5> *unused = nullptr>
bool instatiator() {
  return true;
}

template<template<size_t> class E, size_t I = 1, std::enable_if_t<I < 5> *unused = …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

5
推荐指数
1
解决办法
112
查看次数

pycapnp:在没有自定义 capnp 文件的情况下读取和写入列表

我已通读pycapnp 快速入门和文档,但没有看到有关如何读取和写入基本列表对象(如浮点数列表)的提及。

特别是,我知道如果我在 capnp 文件中编写自定义类型,那么我可以使用类似的方法读取该类型的对象

addressbook_capnp.Person.from_bytes(encoded_message)
Run Code Online (Sandbox Code Playgroud)

我想知道的是读取这样的浮点数列表的语法。我想它看起来像

capnp.List.Float64.from_bytes(encoded_message)
Run Code Online (Sandbox Code Playgroud)

但我根本找不到正确的语法。此外,由于 Capn Proto 不会从 .capnp 文件导出别名,因此我不能只在那里定义浮点数列表(或者看起来是这样)。

有人可以告诉我在 pycapnp 中读取、写入和创建基本对象列表的正确语法吗?


编辑:

例如,在 C++ 中,我可以创建一个列表对象(没有自定义类型),如下所示:

::capnp::MallocMessageBuilder message; 
auto capnp_point_cloud = message.initRoot<::capnp::List<Val>>(num_axes);
for (size_t i = 0; i < num_axes; ++i) { 
    capnp_point_cloud.set(i, array[i]);
}
Run Code Online (Sandbox Code Playgroud)

python capnproto

5
推荐指数
0
解决办法
642
查看次数