我想在全屏无边框窗口中在OpenCV中显示图像.换句话说,只显示图像像素,没有菜单,工具栏或窗口背景.
使用imshow()
或cvShowImage()
不启用它:
我认为问题的根源在于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
.有人得到了解决方法吗?
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) 我有一个像素数组,我需要转换为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开发了很多年,现在才发现一个程序可以在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()
.
我的问题是
我有一个带有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) 我使用openCV编写了一个图像匹配工具(控制台应用程序,没有gui或windows).我想将我的EXE文件移植到另一台计算机,但它要求opencv dll(opencv_core220.dll,opencv_highgui220.dll,...)
我的问题是如何做到这一点.我发现其中任何一种方法都是好的:
我试图使用ILMerge,但它不起作用(错误:不能从a.exe文件加载程序集),因为它仅用于.Net
PS - 我在Windows,c ++编译器,openCV 2.2上使用visual studio 2005
我有一个模板化函数,它处理两种类型的类(旧格式或新格式)。我想定义一个变量,该变量将在编译时定义其类型,例如:
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&
更多背景: