我试图了解下面的代码段是否应该根据标准进行编译.当我尝试使用最新版本的三个主要编译器编译它时,会发生以下情况:
-std=c++17标志):编译罚款;-std=c++17标志):也编译好;/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出错:
Run Code Online (Sandbox Code Playgroud)C:/msvc/v19_16/include\optional(87): error C2182: '_Value': …
大家好!我正在研究一种去马赛克算法,我用它将具有拜耳模式的图像转换为代表红色,绿色和蓝色通道的图像.我希望该算法具有以下属性:
它保留尽可能多的原始信息.
它不会模糊图像中的细节,即使这意味着没有去噪.
到目前为止,我已经提出了使用双线性插值的算法,并生成了三幅图像,这些图像具有马赛克图像的一半大小.该算法比执行CV_BayerBG2BGR转换(双线性插值)的OpenCV的cvtColor算法快约3-4倍.
请参阅下面的拜耳模式草图,了解它的工作原理.我在圆圈标记的点处执行插值.数字代表我乘以下面的像素的系数,以便在由黑色圆圈标记的点中获得内插值.
您可以在下面观察我的算法的结果.我还添加了OpenCV中可用的两种去马赛克算法的结果(双线性插值和可变数量的梯度).请注意,虽然我的算法结果看起来相当差,但如果我对它们进行下采样,OpenCV的双线性插值结果看起来几乎完全相同.这当然是预期的,因为基础算法是相同的.
我目前的解决方案为我的项目提供了可接受的结果,而且速度也可以接受.但是,如果能够改进上面列出的5个标准中的任何一个,我愿意使用速度最快两倍的算法.那么问题是:如何在不显着阻碍性能的情况下改进算法?
我有足够的编程经验来完成这项任务,所以我并不是特别要求代码片段 - 任何类型的答案(代码,链接,建议 - 尤其是基于过去经验的答案)都是受欢迎的.
一些其他信息:
我不是在寻找一般的编程建议(例如一般的优化等),但另一方面,一些特定于任务的答案非常受欢迎.先感谢您.
c++ algorithm signal-processing image-processing computer-vision