У меня на самом деле проблема с итератором в OpenCV. Я читаю из LabView изображение и сохраняю его в Mat imgIn. После этого я создаю второй Mat для обработки изображений Mat imOut. Когда я клонирую это и пытаюсь отправить его обратно в LabView, я получаю черное изображение, поэтому никакой информации не было отправлено.
#include <windows.h>
#include "extcode.h"#include <iostream>
#include <stdio.h>
#include "opencv2/opencv.hpp"#include "opencv2/core.hpp"#include "opencv2/core/utility.hpp"#include "opencv2/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
// --- Dll entry point ---
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(hModule);
UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */__declspec(dllexport) INT myDoSomething(short* M, short* N, short* image, int SizeX, int SizeY, short* imgOut){
// Alloc Memory
Mat imgIn(SizeX, SizeY, CV_16S, &image[0]);
Mat imOut(SizeX, SizeY, CV_16S, &imgOut[0]);// Clone Source Image
imOut = imgIn.clone();
// Get size for DFT
*M = getOptimalDFTSize(imgIn.rows);
*N = getOptimalDFTSize(imgIn.cols);
MatIterator_ it;// = imOut.begin<short>();
//for(int x=0;x<=SizeX;x++){
//imgOut = imOut.at<short>(x,y);
//}
return 0;
}#ifdef __cplusplus
}
#endif /* __cplusplus */
В LabView все правильно.
VS ошибка:
Ошибка Fehler 1 C2955: «cv :: MatIterator_»: Für die Verwendung der template-Klasse istine template-Argumentliste erforderlich.
MatIterator_ это шаблон класса.
это именно то, что говорит ошибка, вы должны указать тип (а также для begin () и end ()):
MatIterator_<short> it = imOut.begin<short>();
for (; it != imOut.end<short>(); ++it)
{
...
}
Других решений пока нет …