Before you start to read this article, you should have read VS2013 Build OpenCV2.4.9 with CUDA.
Some prerequisites are needed:
1. Visual C++ Redistributable Packages for Visual Studio 2013
2. CUDA cuda_6.5.14_windows_general_64
3. OpenCV 2.4.9
4. Intel TBB tbb43_20150316oss
Here are two sample codes, one is written in C++ dll project(CVision) and the other one is a C# windows form program(CVisionClient)
Now I am going to create a new Visual C++ dll project
Choose DLL
Remember to build with x64 platform for this project, otherwise there will be an error something like “external function” cannot be found
CVision.h
CVision.cpp
Let’s take a look in imread, which passes an image filename to the subroutine
1: bool ImageProc::imread(wchar_t* txt)
2: { 3: wstring ws(txt); 4: filename = WstringToString(ws); 5: image = cv::imread( filename );6: if( !image.data)
7: {8: return false;
9: }10: else
11: {12: return true;
13: } 14: return true;
15: }One thing should be take care is wide string to string conversion, which is done by WstringToString function.
1: std::string WstringToString(const std::wstring str)
2: { 3: unsigned len = str.size() * 4;
4: setlocale(LC_CTYPE, "cht");
5: char *p = new char[len];
6: wcstombs(p,str.c_str(),len); 7: std::string str1(p);8: delete[] p;
9: return str1;
10: }And we display image by another function named showImage
1: void ImageProc::showImage()
2: { 3: namedWindow( filename, CV_WINDOW_NORMAL ); 4: imshow(filename, image ); 5: }Finally don’t forget to select CLR supported, and the C++ dll can be called by C# applications
CVision.dll will be created in the directory shown below if your compiled successfully.
G:\CSharp\MyToolkit\x64\Release
=======================================================
Now we are ready to create a C# Windows form application
Now we’re going to add a reference to CVision.dll
and using CVision namespace also
1: private void ToolStripMenuItem_Click(object sender, EventArgs e)
2: {3: OpenFileDialog openFileDialog1 = new OpenFileDialog();
4: openFileDialog1.InitialDirectory = "c:\\";
5: openFileDialog1.Filter = "jpg files (*.jpg)|*.jpg|bmp files (*.bmp)|*.bmp|png files (*.png)|*.png";
6: openFileDialog1.FilterIndex = 0; 7: openFileDialog1.RestoreDirectory = true; 8: if (openFileDialog1.ShowDialog() == DialogResult.OK) 9: { 10: try 11: { 12: ImageProc ip = new ImageProc(); 13: unsafe 14: { 15: byte[] buf = Encoding.Unicode.GetBytes(openFileDialog1.FileName); 16: 17: fixed (byte* p = &buf[0] ) 18: { 19: if( ip.imread((char *)p)) 20: ip.showImage(); 21: } 22: 23: } 24: } 25: catch (Exception ex) 26: { 27: MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 28: }29: }
30: }In the following picture, you can see that the path of input image including traditional Chinese characters that does not cause any problem.
References:











留言列表
