私はOpenCVを使ってトラッキングを行うDLLを開発してきました。 VS 2008を使用してCコンソールプロジェクトで作業しているすべてのものを入手しました(テスト目的)。その後、私は新しいDLLプロジェクトを作り、それをコンパイルしました。私はすべてをセットアップしたので、Thread
クラスの単一の関数を呼び出して、単一の関数を呼び出すだけでした。C#のアンマネージDLLが正しく動作しない
次に、GUIなどのためのC#プロジェクトを作成しました。 DLLは正常にロードされます(System.Runtime.InteropServices
を使用すると、メソッドが開始されます(OpenCVによって作成されたキャプチャウィンドウが表示されますが、追跡は行われていません)。 (追跡が行われていました)
管理対象コードの管理対象外のDLLで作業するのは初めてです。間違っていることや、これをどのようにデバッグできますかに関するアイデアはありますか?この問題を解決するために他に何か必要があれば私はそれを提供します、事前に
感謝を
編集:。。
私が使用していませんよDLL上のクラス、私は単一の関数を使用して、スレッドクラスは、C#のSystem.Threading
から来て
私はDLLを使用している方法はこのようなものです。
namespace GUI
{
static class NativeTracking
{
[DllImport(@"__Tracking.dll")]
public static extern void _Tracking();
}
}
のIは、彼の
public GUI()
{
InitializeComponent();
_tracking = new Thread(_Tracking);
_tracking.Start();
}
public _Tracking()
{
while(True)
{
NativeTracking.Tracking();
}
}
編集などの糸の上に置く:ネイティブコード化された
ネイティブコード、厄介なフォーマットのため申し訳ありません。
ヘッダーファイルDLLIMPORT(P /呼び出し)の問題の
#include <cv.h>
#include <stdio.h>
#include <ctype.h>
#include <windows.h>
#include <highgui.h>
#include "..\original\project\myheader.h"
#include "..\original\project\myheader1.h"
#include "..\original\project\myheader2.h"
#include "..\original\project\myheader3.h"
#include "..\original\project\myheader4.h"
#ifdef __cplusplus
extern "C"{
#endif
_declspec(dllexport) void Tracking();
#ifdef __cplusplus
}
#endif
実装
#include "exposed.h"
void Tracking()
{
int flag = 1, i=0;
iplImgs imgs;
trackingTool tools;
helperTools helperTools;
CvCapture* capture = 0;
capture = cvCaptureFromCAM(0);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240);
cvSetCaptureProperty(capture, CV_CAP_PROP_FPS, 20.0f);
imgs.image = 0;
cvNamedWindow("Window", 0);
initHelperTools(&helperTools);
initTools(&imgs, &tools);
for(;;){
int c;
IplImage* frame = 0;
frame = cvQueryFrame(capture);
if(!frame)
break;
if(!imgs.image){
/* allocate all the buffers */
prepareImages(&imgs, &tools, frame);
}
cvCopy(frame, imgs.image, 0);
cvCvtColor(imgs.image, imgs.grey, CV_BGR2GRAY);
if(flag == 1 || conditionB){
someOperations(&imgs, &tools);
if (conditionC)
flag = 0;
}
else if(conditionD){
otherOps(&helperTools, imgs.grey);
someTrack(&imgs, &tools, &helperTools, drawPoints);
someCorrections(&tools);
if (condition){
if (!wasReset){
wasReset = 0;
continue;
}
if (validation)
someMoreOperations(&tools, corretions);
}
}
bufferHandlingOps(&imgs);
c = cvWaitKey(10);
if((char)c == 27)
break;
switch ((char)c){
case 'p':
drawPoints ^= 1;
break;
default:
;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("Window");
}
Cは、クラスを持っていないので、どちらかあなたはドンスレッド・クラスを持っているか、Cを使用していません。 –
DLL上でクラスを使用していません。単一の関数を使用しています。スレッド・クラスはC#の 'System.Threading'から来ています。 – masterLoki
ネイティブの「トラッキング」メソッドを含めるように質問を編集できますか? –