小编Adr*_*thy的帖子

ISampleGrabber已被弃用?

我有一个旧的计算机视觉实验,它使用Video for Windows从连接到PC的相机中抓取帧.这是一个黑客,它使用VfW创建一个预览窗口,然后它从窗口DC执行GetDIBits.

我终于准备将它移植到DirectShow了.我的理解是我可以使用ISampleGrabber从视频捕获图中获取帧,但现在我读到了不推荐使用ISampleGrabber.

从视频Feed中抓取帧的非弃用方式是什么?我是否必须实现自己的DirectShow过滤器,它基本上与ISampleGrabber的功能相同?

winapi directshow vfw computer-vision

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

StretchDIBits似乎很慢,有没有更快的API?

我想画一个相同大小的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)

performance gdi stretchdibits

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

GetDIBits中的HDC是什么?

GetDIBits用来将屏幕兼容设备上下文中的位图数据转换为某种格式的DIB.我的印象是,当源位图为每像素8位或更少时,DC仅用于合成色表.由于我的源位图是一个完整的32位彩色图像,这是一个一次性的程序,我没有屏幕DC方便,我将HDC参数设置为NULL.这没用.一旦我抓住屏幕DC并将其传入,它就开始工作了.

这让我想知道为什么GetDIBits需要设备上下文.它是干什么用的?

gdi getdibits

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

如何打开临时文件并获取其文件名?

我需要在我的C程序中创建一个临时文件,向其中写入一些数据,然后调用外部命令(通过exec或system)对我刚创建的文件进行一些处理.我没有编写外部命令,也不可能将它集成到我的程序中,因此我认为我不能与它共享已打开的描述符.因此,我需要知道创建的临时文件的名称.

tempname()函数执行此操作,但不幸的是,它建议您不要使用它自己,因为获取名称和打开文件之间可能存在竞争条件,并且它建议的任何函数(tmpfile和mkstemp)都没有提供方法找出创建的文件的实际名称.

c posix file temp

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

Windows的线程本地存储是否初始化值?

我发现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将已分配索引的插槽清空.因此,程序的另一部分之前是否已使用过一个插槽似乎无关紧要.

c++ winapi thread-local-storage

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

在一个字节中,如何将4个较高位与4个较低位进行交换

我昨天接受了采访.

我被问到的一个问题是:如何用4个低位替换一个字节的4个高位.我们在这里谈论本地C,顺便说一句.

例如,考虑以下字节:AB输出应为:BA

好吧,那里的那个人告诉我它可以在一个命令中完成.我只是设法用3个命令做到了.

我问他答案,但他不情愿.

谢谢!

c byte

5
推荐指数
3
解决办法
3060
查看次数

可以用C++编译器规范化Unicode标识符吗?

在C++中,我们可以在标识符中使用各种Unicode字符.例如,您可以命名变量résumé.

那些带有重音的es可以用不同的方式表示:作为预组合字符或作为e具有组合重音字符的普通字符.许多应用程序规范化这些字符串,以便看似相同的字符串实际匹配.

看看C++标准,我没有看到任何需要编译器规范化标识符的东西,因此变量résumé可能与变量不同re?sume?.(在我的测试中,似乎并不像MSVC或clang标准化标识符.)

是否有任何禁止编译器选择正常形式的东西?如果不是,在翻译的哪个阶段应该进行规范化?

[要明确:我在谈论标识符,而不是字符串文字.]

c++ unicode language-lawyer canonicalization unicode-normalization

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

我可以对(非成员)函数使用部分模板专门化吗?

我正在尝试在(非成员)函数上使用部分模板特化,而我正在绊倒语法.我已经在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)

c++ templates partial-specialization

4
推荐指数
2
解决办法
1291
查看次数

数组类型的模板参数推导

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:

  1. 有谁知道它是否已在更高版本的VC++中修复?
  2. 除明确调用之外还有解决方法Foo<3, float>吗?

如果它不是一个bug:

是否有gcc和clang的扩展,允许他们解析模板参数?

我已经将实际代码大大简化为这个小例子.我已经在其他编译器上尝试过,但我目前无法访问更新的Microsoft编译器.我在SO上发现了类似的问题,但没有一个专门针对这种情况.

c++ templates visual-c++

4
推荐指数
1
解决办法
225
查看次数

为什么我不能将assert与std :: is_same一起使用?

有人可以向我解释为什么在地球上这个代码片段拒绝工作?

#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 在这个范围内声明的,编译器本身证实,在以前的错误!

http://ideone.com/LcMVkn

c++ assert

4
推荐指数
1
解决办法
635
查看次数