使用avicap32.dll进行Webcam Capture的我的程序在我的Windows 10开发计算机上运行没有问题,但是当我想在另一台计算机(Windows 7,未激活更新,离线)上使用发布的版本时,该程序运行,但是一旦我尝试从相机捕获图片,它就无法工作。我抛出一个异常,仅此而已。 (另外,我从网络摄像头中得到了黑色图像,我再次检查了网络摄像头是否已连接并且可以访问)。
要添加avicap32.dll,我使用了以下代码:
//This call is one of the most important and is vital to the operation of the OS.
[DllImport("user32", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
//This API creates the webcam instance so we can access it.
[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, int hwndParent, int nID);
//This API opens the clipboard so we can fetch webcam data.
[DllImport("user32", EntryPoint = "OpenClipboard")]
public static extern int OpenClipboard(int hWnd);
//This API cleans the clipboard.
[DllImport("user32", EntryPoint = "EmptyClipboard")]
public static extern int EmptyClipboard();
//This API closes the clipboard after use.
[DllImport("user32", EntryPoint = "CloseClipboard")]
public static extern int CloseClipboard();
//This API retrieves the data from the clipboard for use.
[DllImport("user32.dll")]
extern static IntPtr GetClipboardData(uint uFormat);
//This API is needed to execute the picture indication
[DllImport("cvextern.dll")]
extern static int MyFunction()
这是捕获图像并保存的功能:
public void Capture_Image() {
try {
ImageSize();
m_CapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, Handle.ToInt32(), 0);
SendMessage(m_CapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(m_CapHwnd, WM_CAP_GT_FRAME, 0, 0);
SendMessage(m_CapHwnd, WM_CAP_COPY, 0, 0);
OpenClipboard(m_CapHwnd);
CloseClipboard();
SendMessage(m_CapHwnd, WM_CAP_DISCONNECT, 0, 0);
Image tempImg = (Bitmap)Clipboard.GetData("Bitmap");
pictureBox2.Image = tempImg;
pictureBox2.Refresh();
GC.Collect();
GC.WaitForPendingFinalizers();
fileName = "C:/FHT59N3/Bildanalyse_Projekt/image.jpg";
Clipboard.GetImage().Save(fileName, ImageFormat.Jpeg);
}
catch (NullReferenceException) {
string message = "No Camera found";
string title = "Please connect Camera";
MessageBoxButtons buttons = MessageBoxButtons.OK;
MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
}
}
我是否需要进行特殊设置以使其在Windows 7上运行?
答案 0 :(得分:-1)
这本身并不是解决问题的方法,但是太长了,无法放入注释框中。
您可能要考虑删除
GC.Collect();
GC.WaitForPendingFinalizers();
因为在可能的情况下使用SafeHandle
和/或在处理非托管资源时通常使用the IDisposable
pattern总是更好。
GC.WaitForPendingFinalizers();
阻止程序执行,直到所有终结器都运行为止,并且它可以引入死锁。 GC.Collect();
还会显着降低您的程序速度,因为它会尝试收集所有代-与正常的GC运行相反。它也有很高的过载,因为它需要停止所有线程(=阻止程序执行)并遍历所有对象图以查找可以收集的内存。现在无法收集的每个对象都将被提升到下一代,这意味着您的程序将挂在不再实际需要的内存上。
有关更多信息,请参见GC.Collect()
的“备注”部分以及GC.WaitForPendingFinalizers
的“备注”部分。
另请参见When to call GC.Collect
-规则编号1为“请勿”。
答案 1 :(得分:-1)
好的,我有解决办法。我将读取过程从使用外部Dll更改为使用OpenCV命令。工作良好。甚至更少的代码行。
现在这是我阅读网络摄像头的代码:
@IBAction func smsarrivalnotification(_ sender: UIButton) {
if (sender.isSelected) == true
{
smsarivalimg.image = UIImage(named: "Checked-1")
smsarivallbl.textColor = UIColor.disselectedcolor
sender.isSelected = false
}else{
smsarivalimg.image = UIImage(named: "CheckedSelect")
smsarivallbl.textColor = UIColor.selectedcolor
sender.isSelected = true
}
}