我有一个旧的计算机视觉实验,它使用Video for Windows从连接到PC的相机中抓取帧.这是一个黑客,它使用VfW创建一个预览窗口,然后它从窗口DC执行GetDIBits.
我终于准备将它移植到DirectShow了.我的理解是我可以使用ISampleGrabber从视频捕获图中获取帧,但现在我读到了不推荐使用ISampleGrabber.
从视频Feed中抓取帧的非弃用方式是什么?我是否必须实现自己的DirectShow过滤器,它基本上与ISampleGrabber的功能相同?
我想画一个相同大小的HDC.我正在使用:des和src的大小相同.
::StretchDIBits(hdc,
des.left,des.top,des.right - des.left,des.bottom - des.top,
src.left, GetHeight() - src.bottom, src.right - src.left,src.bottom - src.top,
m_pImg->accessPixels(),m_pImg->getInfo(), DIB_RGB_COLORS, SRCCOPY);
Run Code Online (Sandbox Code Playgroud)
但我发现它很慢,因为des尺寸相同,我只需要将dib复制到dc上.有没有比StretchDIBits更快的方法?
就像
StretchBlt (slow) vs Bitblt.(faster)
StretchDIBits (slow ) vs ?(faster)
Run Code Online (Sandbox Code Playgroud) 我GetDIBits用来将屏幕兼容设备上下文中的位图数据转换为某种格式的DIB.我的印象是,当源位图为每像素8位或更少时,DC仅用于合成色表.由于我的源位图是一个完整的32位彩色图像,这是一个一次性的程序,我没有屏幕DC方便,我将HDC参数设置为NULL.这没用.一旦我抓住屏幕DC并将其传入,它就开始工作了.
这让我想知道为什么GetDIBits需要设备上下文.它是干什么用的?
我需要在我的C程序中创建一个临时文件,向其中写入一些数据,然后调用外部命令(通过exec或system)对我刚创建的文件进行一些处理.我没有编写外部命令,也不可能将它集成到我的程序中,因此我认为我不能与它共享已打开的描述符.因此,我需要知道创建的临时文件的名称.
tempname()函数执行此操作,但不幸的是,它建议您不要使用它自己,因为获取名称和打开文件之间可能存在竞争条件,并且它建议的任何函数(tmpfile和mkstemp)都没有提供方法找出创建的文件的实际名称.
我发现MSDN中有关线程局部存储的初始值的矛盾. 这个页面说:
创建线程时,系统会为TLS分配一个LPVOID值数组,这些值初始化为NULL.
这让我相信,如果我用一个从未为同一索引调用过TlsSetValue的线程调用TlsGetValue,那么我应该得到一个空指针.
但是,这个页面说:
程序员应该确保......在调用TlsGetValue之前调用TlsSetValue.
这表明您不能依赖从TlsGetValue返回的值,除非您确定它已使用TlsSetValue显式初始化.
然而,第二页同时强调了初始化为零的行为:
存储在TLS槽中的数据的值可以为0,因为它仍然具有其初始值,或者因为线程称为TlsSetValue函数为0.
所以我有两个声明说数据被初始化为null(或0),并且有人说我必须在读取值之前显式初始化它.实验上,值似乎是自动初始化为空指针,但我无法知道我是否只是幸运,是否总是这样.
我试图避免使用DLL只是在DLL_THREAD_ATTACH上分配.我想按照以下方式进行懒惰分配:
LPVOID pMyData = ::TlsGetValue(g_index);
if (pMyData == nullptr) {
pMyData = /* some allocation and initialization*/;
// bail out if allocation or initialization failed
::TlsSetValue(g_index, pMyData);
}
DoSomethingWith(pMyData);
Run Code Online (Sandbox Code Playgroud)
这是一种可靠而安全的模式吗?或者,在尝试阅读之前,是否必须在每个线程中显式初始化插槽?
更新:文档还说TlsAlloc将已分配索引的插槽清空.因此,程序的另一部分之前是否已使用过一个插槽似乎无关紧要.
我昨天接受了采访.
我被问到的一个问题是:如何用4个低位替换一个字节的4个高位.我们在这里谈论本地C,顺便说一句.
例如,考虑以下字节:AB输出应为:BA
好吧,那里的那个人告诉我它可以在一个命令中完成.我只是设法用3个命令做到了.
我问他答案,但他不情愿.
谢谢!
在C++中,我们可以在标识符中使用各种Unicode字符.例如,您可以命名变量résumé.
那些带有重音的es可以用不同的方式表示:作为预组合字符或作为e具有组合重音字符的普通字符.许多应用程序规范化这些字符串,以便看似相同的字符串实际匹配.
看看C++标准,我没有看到任何需要编译器规范化标识符的东西,因此变量résumé可能与变量不同re?sume?.(在我的测试中,似乎并不像MSVC或clang标准化标识符.)
是否有任何禁止编译器选择正常形式的东西?如果不是,在翻译的哪个阶段应该进行规范化?
[要明确:我在谈论标识符,而不是字符串文字.]
c++ unicode language-lawyer canonicalization unicode-normalization
我正在尝试在(非成员)函数上使用部分模板特化,而我正在绊倒语法.我已经在StackOverflow中搜索了其他部分模板特化问题,但这些问题涉及类或成员函数模板的部分特化.
作为一个起点,我有:
struct RGBA {
RGBA(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) :
r(red), g(green), b(blue), a(alpha)
{}
uint8 r, g, b, a;
};
struct Grayscale {
Grayscale(uint8 intensity) : value(intensity) {}
uint8 value;
};
inline uint8 IntensityFromRGB(uint8 r, uint8 g, uint8 b) {
return static_cast<uint8>(0.30*r + 0.59*g + 0.11*b);
}
// Generic pixel conversion. Must specialize this template for specific
// conversions.
template <typename InType, typename OutType>
OutType ConvertPixel(InType source);
Run Code Online (Sandbox Code Playgroud)
我可以完全专门化ConvertPixel来制作RGBA到灰度转换函数,如下所示:
template <>
Grayscale ConvertPixel<RGBA, Grayscale>(RGBA …Run Code Online (Sandbox Code Playgroud) Microsoft VC++ 2010在此代码中出错:
template <int D, typename T>
void Foo(T x[D]) {
// details omitted
}
int main() {
float x[3];
Foo(x); // C2784: could not deduce template argument for 'T [D]' from 'float [3]'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
相同的代码通过gcc和clang进行集合.
这是VC++ 2010的错误吗?
如果是一个bug:
Foo<3, float>吗?如果它不是一个bug:
是否有gcc和clang的扩展,允许他们解析模板参数?
我已经将实际代码大大简化为这个小例子.我已经在其他编译器上尝试过,但我目前无法访问更新的Microsoft编译器.我在SO上发现了类似的问题,但没有一个专门针对这种情况.
有人可以向我解释为什么在地球上这个代码片段拒绝工作?
#include <cassert>
#include <type_traits>
using namespace std;
int main()
{
assert(is_same<int, int>::value);
}
Run Code Online (Sandbox Code Playgroud)
编译失败,因为根据编译器:
prog.cpp:7:33: error: macro "assert" passed 2 arguments, but takes just 1
assert(is_same<int, int>::value);
^
prog.cpp: In function 'int main()':
prog.cpp:7:2: error: 'assert' was not declared in this scope
assert(is_same<int, int>::value);
^
Run Code Online (Sandbox Code Playgroud)
什么?is_same<int, int>::value毫无疑问是一个论点.同样assert 是在这个范围内声明的,编译器本身证实,在以前的错误!