这是我第一次来这里。
我目前正在尝试通过遍历所有像素并对那里的颜色做些事情来编写用于图像后处理的类。
我的想法是添加诸如posterize()
或rgbSplit()
之类的方法。初始化它们时,每种效果都不会遍历所有像素,因为效果不是很好。我希望它存储这样一个事实,即当我使用称为process()
的方法时,它应在给定链中处理这些影响。
但是,因此我必须将对效果代码的引用存储在一个列表中(例如矢量),对吗?因为这样我可以进入x和y坐标的for
循环,并在其中添加另一个for循环,该循环遍历了应该应用于像素的所有方法。
问题是,我不知道如何将方法存储在向量中。那有可能吗?还是矢量仅用于对象?还是我可以以某种方式“客观化”一种方法?还是我现在要做的是什么?
答案 0 :(得分:5)
这个问题非常广泛。但是我知道您才刚刚起步,需要在编写一些代码之前先知道是否有可能。
因此,这里是一个简短的底层答案:
StreamWriter
的向量; std::function
或使用{{1} }来实现经典的command pattern)。 但是在更高的层次上,您需要更好地考虑您的设计:
因此,您的设计需要同时处理两种算法。例如,您可以首先将链中的初步像素变换应用于所有像素,然后仅在已变换像素的组上运行算法,然后在链中继续进行。
此外,正如chain of responsibility pattern在评论中指出的那样,另一个问题是,从性能的角度来看,逐个调用算法是否有意义。链接算法也许是个好主意,但是在图像转换级别而不是像素级别。
一旦您考虑了这一点,并开始使用上述想法之一实施解决方案,您可能会回到这里提出更精确的问题,并用一些代码说明。
答案 1 :(得分:0)
如果要使用观察者模式,则boost :: signals2是一个不错的选择。
观察者模式 https://en.wikipedia.org/wiki/Observer_pattern?wprov=sfla1
boost :: signals2 https://www.boost.org/doc/libs/1_72_0/doc/html/signals2.html
干杯, FM。
答案 2 :(得分:0)
我目前正在关注有关函数指针的cherno教程,因为我认为也许我需要一个详细了解它并且结构极好的人。 https://www.youtube.com/watch?v=p4sDgQ-jao4&t=306s
在5分钟时,他通过说void(* cherno)()= HelloWorld;创建了一个函数指针。
我也尝试这样做,但出现错误。这是我的代码:
import numpy as np
startAddress = int('00D00000', 16)
address = startAddress.to_bytes(8, 'little')
address = np.frombuffer(addressMsg, dtype=np.uint8)
address = address[0:4].reshape(4,1)
它强调了someFunc并且错误提示:
“ void(ImagePP :: )()”类型的值不能用于初始化“ void()()”类型的实体
如果我理解正确,它说我不能这样做,因为我不是在主要的,而是在课堂上做的。但是我该怎么办呢?我想在课堂上使用它
答案 3 :(得分:0)
class ImagePP {
public:
std::function<void> someFunc(int i) { DBG("someFunc started: " << i); }
void process() {
DBG("process Started.");
typedef std::function<void>(ImagePP::*FuncPtr)(int);
FuncPtr function = someFunc;
function(5);
}
};
这就是我现在得到的。意识到它想要在那里的类名,但是现在即使函数想要一个整数,它也会在(5)下划线。它说:
显式调用括号前的表达式必须具有(指针指向)函数类型
当我使用常规void而不是std :: function时,我有相同的错误