Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.79.107] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток. Проблема нарисовалась. Получаю с тепловизора массив int16 значений температуры. Надо каждое значение температуры переконвертировать по цветовой шкале. Например я задаю шкалу от 20 градусов по Цельсию до 150 градусов по Цельсию, что будет соответствовать переходу цвета от синего к красному. Если не ошибаюсь, то в OpenCV это соответствует ColorMap_JET. Как перевести значение температуры в цвет не могу придумать, может кто что то дельное посоветует, ибо с Гуглом у меня не сложилось.
Добавлено кстати, OpenCv.Sharp использовать можно, он у меня есть уже в проекте |
Сообщ.
#2
,
|
|
|
так, продолжим, вот до чего доковырял я:
1. Я получаю массив int16 в размере 768 штук, каждое значение поделенное на 100 это температура точки с точностью 2 знака до запятой. Начальное разрешение матрицы 32х24 пикселя 2. Далее я создаю массив картинки bgr_array длинной 32*24*3 3. Далее я преобразую каждое значение температуры в цвет через HSV палитру. То есть маплю диапазон температуры от 10 до 150 градусов к hue от 260 до 0 (обратный диапазон чтобы синий был на низких температурах, красный на высоких), а сатурацию и насыщенность задаю в 1. А далее полученный цвет перевожу из HSV диапазона в RGB public static int ThempToHue(decimal themp) { decimal value = themp/100; if (value > 260) { while (value>260) { value-= 260; } } return (int)Map(value, 10, 150, 260, 0); } итоговый код получения массива следующий var array_csharp = t_array.ToList<UInt16>(); int width = 32; int height = 24; int bytesPerPixel = 3; int pixel_length = width * height * bytesPerPixel; byte[] bgr_array = new byte[pixel_length * bytesPerPixel]; for (int i = 0; i < array_csharp.Count; i++) { int thempToHue = Utilites.ThempToHue(array_csharp[i]); var col = Utilites.ColorFromHSV(thempToHue, 1f, 1f); bgr_array[bytesPerPixel * i] = col.R; bgr_array[bytesPerPixel * i + 1] = col.G; bgr_array[bytesPerPixel * i + 2] = col.B; } Далее пытаюсь преобразовать это дело в картинку с помощью OpenCV Mat src = new Mat(24, 32, MatType.CV_8UC3); src = Cv2.ImDecode(bgr_array.ToArray(), ImreadModes.AnyColor); var fName = $"\\images\\{x}.jpg"; x++; src.SaveImage(fName, new ImageEncodingParam(ImwriteFlags.JpegProgressive, 255)); и вот тут беда, при сохранении выдает ошибку что изображение пустое. В чем может быть дело ? |
Сообщ.
#3
,
|
|
|
Pit-Bul, сорян - не владею шарпомъ. Но умею запрягать ChatGPT. Зацени-затести ответ его, может быть поможет:
using OpenCvSharp; using System; class Program { static void Main(string[] args) { // Задайте значения шкалы температур double minTemp = 20; double maxTemp = 150; // Задайте массив значений температуры short[] temperatureValues = { 50, 75, 100, 125 }; // Создайте матрицу для хранения значений температуры Mat temperatureMatrix = new Mat(1, temperatureValues.Length, MatType.CV_16S, temperatureValues); // Нормализуйте значения температуры в диапазон от 0 до 1 Mat normalizedMatrix = new Mat(); Cv2.Normalize(temperatureMatrix, normalizedMatrix, 0, 255, NormTypes.MinMax, MatType.CV_8U); // Преобразуйте значения температуры в цвета с использованием ColorMap_JET Mat coloredImage = new Mat(); Cv2.ApplyColorMap(normalizedMatrix, coloredImage, ColormapTypes.Jet); // Выведите результат Cv2.ImShow("Colored Image", coloredImage); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); } } Комментарий ChatGPT: В этом примере мы используем библиотеку OpenCvSharp для работы с OpenCV в C#. Мы создаем матрицу temperatureMatrix, содержащую значения температуры, затем нормализуем ее и применяем цветовую шкалу ColormapTypes.Jet с помощью функции ApplyColorMap. Результат будет отображен в окне. |
Сообщ.
#4
,
|
|
|
Majestio, спасибо большое. Вроде стало лучше, но картинки по прежнему нет, буду ковырять Ваш вариант.
|
Сообщ.
#5
,
|
|
|
Цитата Pit-Bul @ Majestio, спасибо большое. Вроде стало лучше, но картинки по прежнему нет, буду ковырять Ваш вариант. ChatGPT часто врет - и это нужно учитывать. Но наколки на варианты вычислений нужно "запоминать". |
Сообщ.
#6
,
|
|
|
ну по крайней мере мат теперь не пустой и с этим уже можно работать
|
Сообщ.
#7
,
|
|
|
я наверное тупой, но что то не выходит аленький цветочек. Код от Majestio работает, но выдает линию а не изображение 24х32 пикселя
пытаюсь сделать решапе не выходит ndarray t_array = np.frombuffer(data.Skip(8).ToArray(), dtype: np.Int16); t_array.reshape(24, 32); Добавлено пошел дальше, преобразовал массив в двумерный, тоже не помогает ndarray t_array = np.frombuffer(data.Skip(8).ToArray(), dtype: np.Int16); int index = 0; Int16[,] twoDimensionalArray = new Int16[24, 32]; var tmp = t_array.ToList<Int16>(); for (int x = 0; x < 24; x++) { for (int y = 0; y < 32; y++) { twoDimensionalArray[x, y] = tmp[index]; index++; } } Mat temperatureMatrix = new Mat(1, t_array.ToArray().Length, MatType.CV_16S, tmp.ToArray()); Mat normalizedMatrix = new Mat(); Cv2.Normalize(temperatureMatrix, normalizedMatrix, 0, 255, NormTypes.MinMax, MatType.CV_8U); Mat coloredImage = new Mat(); Cv2.ApplyColorMap(normalizedMatrix, coloredImage, ColormapTypes.Jet); |
Сообщ.
#8
,
|
|
|
прошу прощения, я реально походу тупой, либо устал )))
Mat temperatureMatrix = new Mat(1, t_array.ToArray().Length, MatType.CV_16S, tmp.ToArray()); вот оно зло, должно быть Mat temperatureMatrix = new Mat(24, 32, MatType.CV_16S, tmp.ToArray()); |
Сообщ.
#9
,
|
|
|
все заработало как и хотелось
|