2012-11-21 34 views
5

Tôi đã phát triển một chương trình C++ sử dụng OpenCV. Bây giờ tôi muốn phát triển một ứng dụng dựa trên biểu mẫu cửa sổ trong C#. Vì C# chỉ có thể xử lý mã được quản lý nên gần như không thể chạy OpenCV trực tiếp trên ứng dụng C#. Tôi đã tìm kiếm các cách khác nhau để tạo ứng dụng C# sử dụng OpenCV, một trong số đó là EmguCV và phương pháp khác mà tôi quan tâm nhiều hơn là nhập tệp C++ .dll trong ứng dụng C# và gọi các hàm không được quản lý theo cách này.gọi mã opencv C++ trong ứng dụng C#

Tôi bắt đầu bằng cách tạo các hàm đơn giản trong C++ và tôi có thể sử dụng coutcin trong ứng dụng C# của mình bằng cách nhập dll. vấn đề này được đưa ra khi tôi cố gắng để bao gồm các tập tin header OpenCV trong ứng dụng C++ của tôi và khi tôi biên soạn tôi nhận được lỗi này

lỗi LNK1104: không thể mở tập tin 'tbb_debug.lib'

Một số ai đã thực hiện điều này trước đây nhưng tôi không thể tìm ra cách ông giao diện c + + với C# trong Displaying webcam feed in cv::Mat format in a picturebox

Câu hỏi là tôi có chức năng nhận trong biến cv :: Mat và thực hiện xử lý hình ảnh trên đó và trả về ma trận đã xử lý. tôi muốn sử dụng hàm đó được viết bằng C++ trong ứng dụng C# của tôi. nhưng vấn đề là tôi không thể tạo dll khi tôi đưa thư viện OpenCV vào C++.

Vì vậy, vui lòng không đề nghị tôi sử dụng EmguCV hoặc bất kỳ trình bao bọc .NET nào khác cho OpenCV.

tôi đang sử dụng Visual Studio 2010 cho Dự án của mình.

+0

Câu hỏi là gì? Bạn đã đề cập, rằng bạn có thể tạo một DLL và truy cập nó bằng P/Invoke. Bạn cũng có thể sử dụng C++/CLI để viết một assembly, nó truy cập vào các phần đầu của native và sử dụng các thư viện nguyên gốc. Đối với lỗi liên kết, bạn đã cung cấp không đủ thông tin để chúng tôi biết, điều gì là sai. – Spook

+0

Tôi đã chỉnh sửa bài đăng, khi tôi cố gắng viết bất kỳ phương pháp nào sử dụng OpenCV tôi gặp phải lỗi mà tôi đã đăng ở trên để dll không thể được tạo nhưng khi tôi chỉ sử dụng cout và cin không có lỗi nào xuất hiện và dll đã được tạo thành công –

Trả lời

3

tôi sẽ xuất khẩu một cách rõ ràng phương pháp quấn điểm nhập của bạn trong một C++ header, và sau đó sử dụng P/Invoke để tham khảo chúng:

extern "C" __declspec(dllexport) BOOL DoSomething(); 

Sau đó, tiêu thụ chúng trong thư mục C#:

[DllImport("MyOpenCVWrapper.dll")] 
private static extern bool DoSomething(); 

Tôi sẽ không cố gắng tham khảo các tiêu đề OpenCV.

+0

Cảm ơn rất nhiều. nó giải quyết được vấn đề của tôi. –

1

Mặc dù nó có thể không phải là những gì bạn đang tìm kiếm, tôi đã làm nhiệm vụ đó với C++/CLI và tiếp xúc với nó thông qua một hội đồng. Nó đã được thẳng về phía trước và làm việc khá tốt. Blog article here.