Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 09.06.2016
Сообщений: 21
1

Объект имеет значения null

30.06.2016, 12:25. Показов 2252. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте
проблема такова:
панель для рисования zedGraphControl почему-то возвращает значение null.
и что только уже не пробовал, все без толку.
не удивляйтесь коду, походу все объясню)
помогите пожалуйста....

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
using System;
using System.Drawing;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using ZedGraph;
 
namespace OpenCVTemplate
{
    public partial class MainForm : Form
    {
 
       
        /// Максимальный размер очереди
       
        int _capacity = 320;
 
        
        /// Здесь храним данные
       
        List<double> _data;
 
       
        /// Для генерации слуайных данные по таймеру
       
        Random _rnd = new Random();
 
        // Интервал изменения данных по вертикали
        double _ymin = -0.001;
        double _ymax = 0.001;
 
        public void DrawGraph()
        {
 
            // Получим панель для рисования
            GraphPane pane = zedGraphControl1.GraphPane;
 
            // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
            pane.CurveList.Clear();
 
            // Создадим список точек
            PointPairList list = new PointPairList();
 
            // Интервал, где есть данные
            double xmin = 0;
            double xmax = _capacity;
 
            // Расстояние между соседними точками по горизонтали
            double dx = 1.0;
 
            double curr_x = 0;
 
            // Заполняем список точек
            foreach (double val in _data)
            {
                list.Add(curr_x, val);
                curr_x += dx;
            }
            // Очистим список кривых от прошлых рисунков (кадров)
            pane.CurveList.Clear();
            LineItem myCurve = pane.AddCurve("Random Value", list, Color.Blue, SymbolType.None);
 
 
            // Устанавливаем интересующий нас интервал по оси X
            pane.XAxis.Scale.Min = xmin;
            pane.XAxis.Scale.Max = xmax;
 
            // Устанавливаем интересующий нас интервал по оси Y
            pane.YAxis.Scale.Min = _ymin;
            pane.YAxis.Scale.Max = _ymax;
 
            // Вызываем метод AxisChange (), чтобы обновить данные об осях. 
            // В противном случае на рисунке будет показана только часть графика, 
            // которая умещается в интервалы по осям, установленные по умолчанию
            zedGraphControl1.AxisChange();
 
            // Обновляем график
            zedGraphControl1.Invalidate();
        }
 
        public void timer2_Tick(object sender, EventArgs e)
        {
 
            // Вычислим новое значение
            double newValue = _rnd.NextDouble() * (_ymax - _ymin) + _ymin;
 
            // Добавим его в конец списка
            _data.Add(newValue);
 
            // Удалим первый элемент в списке данных, 
            // если заполнили максимальную емкость
            if (_data.Count > _capacity)
            {
                _data.RemoveAt(0);
            }
 
            DrawGraph();
        }
 
        /// <summary>
        /// відеопотік OpenCV
        /// </summary>
        public Capture capture;
        public Image<Bgr, byte> frameImage;
        public Image<Bgr, byte> currentFrame;
 
        public MainForm()
        {
            _data = new List<double>();
 
            DrawGraph();
            InitializeComponent();
            StartCapture();
        }
 
        public void StartCapture()
        {
            if (capture == null)
            {
                try
                {
                    capture = new Capture();//захоплюємо відеопотік
                    capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 320);//встановлення розмірів кадрів
                    capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 200);//
                    currentFrame = capture.QueryFrame();//Захоплення кадра BGR
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
 
            Application.Idle += new EventHandler(QueryFrame);
        }
 
       public void QueryFrame(object sender, EventArgs e)
        {
            frameCount++;
            //capture frame
            if (capture != null)
            {
                var frame = capture.QueryFrame();
                //process frame
                ProcessFrame(frame);
                currentFrame = frame;
            }
            //show fps
            lbFPS.Text = (int)fps + " fps";
           
            //show image
            ibLeft.Image = currentFrame;
        }
 
        float[] prevHist;
        public float totalShift;
 
        public void ProcessFrame(Image<Bgr, byte> frame)
        {
            using(var gray = frame.Convert<Gray, byte>())//перетворюємо в градації сірого
            using(var grayHoriz = gray.Resize(frame.Width, 1, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR))//стискаємо зображення по вертикалі, для отримання вертикальної гістограми
            {
                //копіюємо піксели в float[]
                var data = grayHoriz.Data;
                var hist = new float[frame.Width];
                for (int i = 0; i < hist.Length; i++)
                    hist[i] = data[0, i, 0];
                //якщо гістограма попереднього кадра відсутня - виходимо
                if(prevHist == null)
                {
                    prevHist = hist;
                    return;
                }
                //шукаємо максимум кроскореляції
                var bestShift = 0;
                var bestCorr = 0f;
                var offset = 50;
                for (int shift = - offset; shift <= offset; shift++)//перебираємо різні зсуви
                {
                    //розраховуємо кореляцію між гістограмою попереднього і даного кадру
                    var corr = Correlation(hist, offset + shift, prevHist, offset, frame.Width - offset * 2);
                    if(corr > bestCorr)//шукаємо максимальну кореляцію
                    {
                        bestCorr = corr;
                        bestShift = shift;
                    }
                }
                //накопичення зміщення (одиничне зміщення - в bestShift)
               totalShift +=  bestShift;
                //лінія
                frame.Draw(new LineSegment2DF(new PointF(totalShift, 0), new PointF(totalShift, frame.Height)), new Bgr(Color.Red), 2);
                //запам"ятовуємо гістограму для розрахунку послідуючого зміщення
                prevHist = hist;
                toolStripStatusLabel1.Text = (float)totalShift + " pixels ";// вивід зміщення зображення
                toolStripStatusLabel2.Text = (float)bestShift*fps + " p/s ";// вивід швидкості зміщення зображення
            }
        }
 
        public static float Correlation(float[] x, int startX, float[] y, int startY, int count) //функція розрахунку кореляції
        {
            if (count == 0) return 0;
            float sumX = 0;
            float sumY = 0;
            float sumXX = 0;
            float sumYY = 0;
            float sumXY = 0;
 
            for (int i = 0; i < count; i++)
            {
                float X = x[i + startX];
                float Y = y[i + startY];
                sumX += X;
                sumXX += X * X;
                sumY += Y;
                sumYY += Y * Y;
                sumXY += X * Y;
            }
 
            float s = (float)Math.Sqrt((sumXX - sumX * sumX * count) / (sumYY - sumY * sumY * count));
            if (Math.Abs(s) <= float.Epsilon)//якщо модуль s менший найменшого додатнього значення,то повертаємо 0
                return 0;
            return (sumXY - sumX * sumY / count) / s;
        }
        //лічильник кадрів
        #region fps counter  
        int frameCount = 0;
        int oldFrameCount = 0;
        DateTime oldTime = new DateTime();
        double fps;
 
        public void timer1_Tick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            fps = 1000 * (frameCount - oldFrameCount) / (now - oldTime).TotalMilliseconds;
            Text = string.Format("{0:0 fps}", fps);
            oldFrameCount = frameCount;
            oldTime = now;
        }
        #endregion}}}
Миниатюры
Объект имеет значения null  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2016, 12:25
Ответы с готовыми решениями:

Ошибка, объект имеет значение null
Подскажите, как исправить ошибку в моём коде. Мне нужно, чтобы кнопка Searsh становилась активна,...

Как проверить null или сылка на объект не указывает на экземпляр объекта
Здравствуйте!При отладке программа вылетает и выходит сообщение и указывает на эти строки: ...

Сервер отправляет объект не null, а клиент принимает null
Помогите пожалуйста! У меня в клиент-серверном приложении творится что-то странное! Короче с...

Не создаётся объект когда один из параметров null
// создание объекта, 4-й параметр null - так ничего не происходит FRequest request = new...

8
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
30.06.2016, 13:12 2
а вот так:
C#
1
2
3
4
5
6
7
8
 public MainForm()
        {
            _data = new List<double>();
 
            InitializeComponent();
            DrawGraph();
            StartCapture();
        }
1
1 / 1 / 0
Регистрация: 09.06.2016
Сообщений: 21
30.06.2016, 15:33  [ТС] 3
slashvlz, йо-ма-йо)
действительно, нужно же было сначала инициализировать все компоненты
спасибо большое)

но теперь появилась проблема серьезней.....могли бы вы посмотреть проект?
почему-то график не рисует(
Вложения
Тип файла: zip OpenCVTemplate2.zip (9.55 Мб, 6 просмотров)
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
30.06.2016, 15:40 4
unhelpful, Даже смотреть не буду) В прошлый раз когда смотрел увидел, что у вас таймер который должен вызывать метод перерисовки нигде не вызывается. Точнее нигде не подписаны на событие срабатывания таймера.
0
1 / 1 / 0
Регистрация: 09.06.2016
Сообщений: 21
30.06.2016, 15:57  [ТС] 5
slashvlz
хммм
по делу говорите)
но первый таймер то у меня запускается, при том что я его тоже нигде не вызываю...
где в таком случае вызвать таймер прорисовки, подскажите?)
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
30.06.2016, 16:25 6
unhelpful, обычно VS прописывает их в методе InitializeComponent(); можете туда добавить или же после вызова этого метода в конструкторе.
Вы уверены, что вам надо это обновлять по таймеру? Логичнее делать обновление по факту изменения данных.
1
1 / 1 / 0
Регистрация: 09.06.2016
Сообщений: 21
30.06.2016, 17:14  [ТС] 7
slashvlz, это правильно, по сути так мне и надо обновлять график (в реальном времени по факту поступления новых данных).
Но если с таймером у меня еще пример был, то тут я не справлюсь
а по сути, мне нужно выводить на график переменную totalShift. Она являет собой накопления сдвига изображения.

я был бы очень признателен, если бы Вы смогли помочь мне в этом
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
01.07.2016, 09:47 8
Лучший ответ Сообщение было отмечено unhelpful как решение

Решение

unhelpful, посмотрел, там всё проще, либо в дизайнере на втором таймере в окне свойств надо свойство Enabled выставить в true, либо в конструкторе формы после инициализации контролов прописать timer2.Enabled = true;
1
1 / 1 / 0
Регистрация: 09.06.2016
Сообщений: 21
02.07.2016, 00:16  [ТС] 9
slashvlz, я в панике
я же заметил что разрешения не поставил, и прописал true, да вот только еще раз на первый таймер)
у меня во втором таймере было прописано timer1.Enabled = true) вот так вот я лоханулся)
спасибо большое)

Добавлено через 20 минут
slashvlz, и хочу сразу еще раз у Вас спросить...
у Вас проект уже есть, посмотрите пожалуйста что рисует график, когда вместо рандомных значений поставить переменную totalShift....
рисует вертикальные линии....почему, это я знаю, потому что значения только от оси Х зависят. Но и зависимость оси Y от времени тоже нету смысла ставить, ведь график динамический, и так меняется во времени....блин, даже не знаю что сделать...
А рандом то нормально рисует, хотя разницы между рандомом и переменной не вижу...

Добавлено через 56 минут
slashvlz, всееее)
проблему решил)))
все намного проще чем я думал:
// Вычислим новое значение
double newValue = totalShift ;
1
02.07.2016, 00:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2016, 00:16
Помогаю со студенческими работами здесь

Удаление объекта из листа, когда объект становится null
Всем привет. Есть класс, допустим это клетка на поле class Foo { public...

Ссылка на объект не указывает на экземпляр объекта (dataGridView1 было null)
Делал программу по видео, там все нормально, у меня выдает ошибку....

Имеет ли смысл использовать объект System.Timers.Timer в другом потоке
Добрый день! У меня по таймеру (System.Timers.Timer) в службе Windows Service, вызываются методы,...

EF: null-значения
Есть такое описание свойства: public class SomeUnit { public int?...

Объект не имеет атрибута, хотя он его имеет. Почему так?
Друзья! Ковыряюсь в классах. Пытаюсь понять логику поведения как она задумана создателями, ибо в...

Какой тип имеет переменная, если её значение null? QJsonDocument
{a: &quot;тип QString&quot;, b: 10, // определяет как double c: null // а здесь какой typeName() ? } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru