小编Nej*_*ejc的帖子

编译器中关于在丢弃的if constexpr(false)语句中实例化模板的行为不一致

我试图了解下面的代码段是否应该根据标准进行编译.当我尝试使用最新版本的三个主要编译器编译它时,会发生以下情况:

  • 锵(7.0.0版本,-std=c++17标志):编译罚款;
  • ✓GCC(版本8.2,带-std=c++17标志):也编译好;
  • ❌MSVC(版本19.16,带/std:c++17标志):编译器错误(见下文).

发生此错误是因为std::optional<void>尽管代码被丢弃,MSVC编译器似乎试图实例化.GCC和Clang似乎没有这样做.

标准是否清楚地定义了在这种情况下应该发生什么?

#include <optional>  
#include <type_traits>
template<typename T, typename... Args>
struct Bar
{
  void foo(Args... args)
  {
    if constexpr(!std::is_same_v<T, void>) // false
    {
      // MSVC compiler error occurs because of the line below; no error occurs when compiling with GCC and Clang 
      std::optional<T> val; 
    }
  }
};
int main(int argc, char** argv)
{
  Bar<void, int> inst;
  inst.foo(1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

MSVC出错:

C:/msvc/v19_16/include\optional(87): error C2182: '_Value': …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++17

19
推荐指数
2
解决办法
929
查看次数

包含下采样的去马赛克算法

简介:我在做什么.

大家好!我正在研究一种去马赛克算法,我用它将具有拜耳模式的图像转换为代表红色,绿色和蓝色通道的图像.我希望该算法具有以下属性:

  1. 它保留尽可能多的原始信息.

  2. 它不会模糊图像中的细节,即使这意味着没有去噪.

  3. 它产生尽可能少的工件.
  4. 如果马赛克图像的尺寸是N×N,则三个彩色图像应各自具有N/2×N/2的尺寸.
  5. 算法应该很快.为了将"快速"放入上下文中,让我这样说:我会满足于使用双线性插值的OpenCV算法至少两倍的速度.

到目前为止我取得了什么.

到目前为止,我已经提出了使用双线性插值的算法,并生成了三幅图像,这些图像具有马赛克图像的一半大小.该算法比执行CV_BayerBG2BGR转换(双线性插值)的OpenCV的cvtColor算法3-4倍.

请参阅下面的拜耳模式草图,了解它的工作原理.我在圆圈标记的点处执行插值.数字代表我乘以下面的像素的系数,以便在由黑色圆圈标记的点中获得内插值.

在此输入图像描述

您可以在下面观察我的算法的结果.我还添加了OpenCV中可用的两种去马赛克算法的结果(双线性插值和可变数量的梯度).请注意,虽然我的算法结果看起来相当差,但如果我对它们进行下采样,OpenCV的双线性插值结果看起来几乎完全相同.这当然是预期的,因为基础算法是相同的.

在此输入图像描述

......所以最后:问题.

我目前的解决方案为我的项目提供了可接受的结果,而且速度也可以接受.但是,如果能够改进上面列出的5个标准中的任何一个,我愿意使用速度最快两倍的算法.那么问题是:如何在不显着阻碍性能的情况下改进算法?

我有足够的编程经验来完成这项任务,所以我并不是特别要求代码片段 - 任何类型的答案(代码,链接,建议 - 尤其是基于过去经验的答案)都是受欢迎的.

一些其他信息:

  • 我在C++工作.
  • 该算法经过高度优化,使用SSE指令并且是非并行的.
  • 我使用大图像(几MB); 缓存感知和避免多次通过图像非常重要.

我不是在寻找一般的编程建议(例如一般的优化等),但另一方面,一些特定于任务的答案非常受欢迎.先感谢您.

c++ algorithm signal-processing image-processing computer-vision

15
推荐指数
1
解决办法
1305
查看次数