Я загружаю C++-библиотеку из моего кода на C# динамически. Я хочу найти маленькое изображение внутри большого, преобразование большого изображения в byte[]
и небольшое изображение, читаемое с физического пути.
Когда я звоню imdecode
, тогда large_img
всегда возвращает 0
cols
и rows
.MatchTemplate изображение с изображением, преобразованным в указатель BYTE в OpenCV
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());
}
Что я делаю неправильно здесь?
Примечание. Я проверил, что путь изображения правильный, а массив байтов не пуст.
Edit 1
Я изменил код немного, предоставляя большое изображение width
и height
, также избавились от imdecode
и что-то изменилось, как в this post.
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
метод он бросает исключение:
Зачем вам «imdecode» здесь? 'largeImgBuf', похоже, содержит правильные данные. Также 'CV_32FC1' выглядит неправильно. Просьба попробовать что-то вроде 'Mat large_img (bufLength, 1, CV_8UC3, largeImgBuf);' – Miki
@Miki Спасибо за ответ, хотя то же самое происходит с 'CV_8UC3'. Я скоро обновляю свой вопрос с дополнительной информацией. – Edgar