小编Dan*_*HsH的帖子

如何在openCV中以全屏无边框窗口显示图像

我想在全屏无边框窗口中在OpenCV中显示图像.换句话说,只显示图像像素,没有菜单,工具栏或窗口背景.

使用imshow()cvShowImage()不启用它:

  1. 窗口的宽度增加到全屏但不是高度.它错过了几个像素.
  2. 即使通过更改窗口处理程序的设置,我也无法使其无边界.

我认为问题的根源在于cvNamedWindow()创建主WS_OVERLAPPED窗口的方法,然后创建一个子项以及所有函数imshow()或者cvGetWindowHandle()对子项进行操作.

因此即使是windows命令:

SetWindowLong((HWND)cvGetWindowHandle(winName), GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP);
Run Code Online (Sandbox Code Playgroud)

没有帮助,因为孩子不能无国界WS_POPUP.有人得到了解决方法吗?

  • 也许,在不使用opencv内置方法的情况下向窗口显示opencv mat
  • 或某种窗口技巧

PS我尝试了以下代码:

cvMoveWindow("AAA",0,0);
cvSetWindowProperty("AAA", CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN);

// Also I tried this:
HWND hwnd = (HWND)cvGetWindowHandle("AAA");
RECT windowRect;
windowRect.left = 0;
windowRect.top = 0;
windowRect.right = cxScreen; //Display resolution
windowRect.bottom = cyScreen; //Display resolution
AdjustWindowRect(&windowRect,WS_VISIBLE,false);
long p_OldWindowStyle = SetWindowLongPtr(hwnd,GWL_STYLE,WS_POPUP);
SetWindowPos(hwnd,HWND_TOP,0,0,windowRect.right,windowRect.bottom,SWP_FRAMECHANGED | SWP_SHOWWINDOW);
SetWindowLong(hwnd, GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP); 
Run Code Online (Sandbox Code Playgroud)

c winapi opencv image

9
推荐指数
1
解决办法
2万
查看次数

如何将像素数组转换为HBITMAP

我有一个像素数组,我需要转换为HBITMAP才能在窗口中显示它.我尝试使用CreateDIBitmap()但我没有BMP标头.我尝试根据MSDN文档手动构建它们,但这不起作用.

这是我的代码看起来如何

HBITMAP hBitmap
char pixels[160*120]; // White grayscale image of size 160x120
memset(pixels,255,sizeof(pixels));

BITMAPINFOHEADER bmih;
bmih.biSize     = sizeof(BITMAPINFOHEADER);
bmih.biWidth    = 160;
bmih.biHeight   = -120;
bmih.biPlanes   = 1;
bmih.biBitCount = 8;
bmih.biCompression  = BI_RGB ;
bmih.biSizeImage    = 0;
bmih.biXPelsPerMeter    =   10;
bmih.biYPelsPerMeter    =   10;
bmih.biClrUsed  =0;
bmih.biClrImportant =0;

BITMAPINFO dbmi;
dbmi.bmiHeader = bmih;
dbmi.bmiColors->rgbBlue = 0;
dbmi.bmiColors->rgbGreen = 0;
dbmi.bmiColors->rgbRed = 0;
dbmi.bmiColors->rgbReserved = 0;
void* bits = (void*)&(pixels[0]); 
hBitmap = CreateDIBitmap(localDC, &bmih, CBM_INIT, qB.bmBits, &dbmi, DIB_RGB_COLORS);
Run Code Online (Sandbox Code Playgroud)

现在我得到一个非NULL的hBitmap,它很好,但它总是显示黑色图像,好像它没有指向像素数组.我使用代码检查了它

BITMAP qB; …
Run Code Online (Sandbox Code Playgroud)

c++ dib winforms createdibsection

9
推荐指数
2
解决办法
7256
查看次数

程序执行没有在main()开始

我在C开发了很多年,现在才发现一个程序可以在main()函数之前执行代码.这是一个代码示例

int generateNum(){
    // Some malicious code here...
    return 5;
}

static int someArray[] = {generateNum(),generateNum()}  

int main(){
     // Some code here...
}
Run Code Online (Sandbox Code Playgroud)

该函数generateNum()之前被调用两次main().

我的问题是

  1. 谁调用generateNum()?我知道在Windows上它是crtexe()
  2. 这种行为是否在不同平台上标准化:Windows/Linux/Android/iOS?
  3. 如何获得有关此行为的更多信息?我想在谷歌搜索,但我不知道如何描述它.
  4. 我可以在generateNum()中做任何我想做的事吗?我的意思是,我可以调用malloc()吗?那fopen()和fwrite()怎么样?我可以打开套接字并通过UDP发送信息吗?最终我可以滥用这个功能甚至从它调用main():-)

c++

7
推荐指数
2
解决办法
387
查看次数

调用c ++ dll函数从c#返回char*.不能使用DllImport()

我有一个带有2个函数的c ++ dll

const char* getVersionText1(void);
void        getVersionText2(const char** res);
Run Code Online (Sandbox Code Playgroud)

两个函数都返回一个描述产品版本的字符串.第一个函数将它作为const char*返回(这意味着它在内部分配和处理它),第二个函数获取一个指向char*的指针,并将其设置为指向描述版本的char*.

我想从C#调用这些函数并显示文本.我不能使用[dllimport ...]样式,因为调用函数的顺序很重要.我首先调用构造函数而不是getVersion,最后是析构函数.所以必须先将dll加载到内存中.

您能否发布几行代码打印两种功能的文本.我是C#的新手,很抱歉如果你发现我的代码有问题我试过了

static class NativeMethods{
    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);
}
class Program{
    // Define function pointers to entires in DLL
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate IntPtr getVersionText1();
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void getVersionText2(IntPtr );
    static void Main(string[] args){
        // Pointers to functions of DLL.
        getVersionText1 f1;
        getVersionText2 f2;
        IntPtr pDll = …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll character-encoding

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

如何在Executable中嵌入openCV Dll

我使用openCV编写了一个图像匹配工具(控制台应用程序,没有gui或windows).我想将我的EXE文件移植到另一台计算机,但它要求opencv dll(opencv_core220.dll,opencv_highgui220.dll,...)

我的问题是如何做到这一点.我发现其中任何一种方法都是好的:

  1. 将opencv重新编译为静态库(.lib而不是.dll).那没用.我得到10个关于cap_vfw.obj的链接器错误
  2. 如果可能,如何将DLL合并/嵌入到exe文件中.

我试图使用ILMerge,但它不起作用(错误:不能从a.exe文件加载程序集),因为它仅用于.Net

PS - 我在Windows,c ++编译器,openCV 2.2上使用visual studio 2005

c++ dll opencv exe visual-studio-2005

3
推荐指数
1
解决办法
8127
查看次数

std::conditional_t,当两个分支不同时编译时如何有条件地定义变量的类型?

我有一个模板化函数,它处理两种类型的类(旧格式或新格式)。我想定义一个变量,该变量将在编译时定义其类型,例如:

template <typename T>
using MyType = std::conditional_t<isNewFormatCondition<T>, typename T::subClass::Format, typename T::Format::reference>

template <typename T>
extract(T& t){
  MyType<T> var{t.getFormat()};
}
Run Code Online (Sandbox Code Playgroud)

我的意思是,对于新类 T,var 将具有 T::subClass::Format 类型,对于旧类,它将是 T::Fromat&

更多背景:

c++ templates

0
推荐指数
1
解决办法
208
查看次数