Изображение MatchTemplate с изображением, преобразованным в указатель BYTE в OpenCVC#

Место общения программистов C#
Anonymous
Изображение MatchTemplate с изображением, преобразованным в указатель BYTE в OpenCV

Сообщение Anonymous »

Я динамически загружаю библиотеку C++ из своего кода C#. Я хочу найти маленькое изображение внутри большого, преобразуя большое изображение в byte[] и маленькое изображение, считываемое по физическому пути.
Когда я вызываю imdecode, big_img всегда возвращает 0 столбцов и строк.

C#

Код: Выделить всё

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate ImageParams GetImageParams(IntPtr dataPtr, int size, string path);

// ...

byte[] largeImgByteArr = this.BitmapToByteArray(bmp);
IntPtr dataPtr = Marshal.AllocHGlobal(largeImgByteArr.Length);
Marshal.Copy(dataPtr, largeImgByteArr, 0, largeImgByteArr.Length);
C++

Код: Выделить всё

ImageParams GetImageParams(BYTE* largeImgBuf, int bufLength, const char* smallImgPath)
{
Mat large_img_data(bufLength, 1, CV_32FC1, largeImgBuf);

Mat large_img = imdecode(large_img_data, IMREAD_COLOR);
Mat small_img = imread(smallImgPath, IMREAD_COLOR);

int result_cols = large_img.cols - small_img.cols + 1;
int result_rows = large_img.rows - small_img.rows + 1;

Mat result;
result.create(result_cols, result_rows, CV_32FC1);

matchTemplate(large_img, small_img, result, CV_TM_SQDIFF_NORMED);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
}
Что я здесь делаю не так?

Примечание: я проверил, что путь к изображению правильный и массив байтов не пуст.

Изменить 1

Я немного изменил свой код, предоставив большую ширину изображения и высоту, также избавился от imdecode и изменил что-то вроде этого поста.

Код: Выделить всё

ImageParams GetImageParams(BYTE* largeImgBuf, int height, int width, int bufLength, const char* smallImgPath)
{
// Mat large_img = imdecode(large_img_data, IMREAD_COLOR);
Mat large_img = Mat(height, width, CV_8UC3, largeImgBuf);
Mat small_img = imread(templPath, 1);

/// ...
}
Теперь он возвращает строки и столбцы, но при вызове метода matchTemplate выдается исключение:

Изображение

Вернуться в «C#»