Форум программистов, компьютерный форум, киберфорум
C++: OpenCV
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 3

OpenCV: получить гистограммы каналов для области изображения

14.09.2014, 22:32. Показов 6628. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня есть простой код, который собирается, но вылетает при запуске.
Задача: получить гистограммы каналов для области изображения. Код найден в интернете и чуть-чуть подправлен.

Вот, собственно, код:

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
#include "stdafx.h"
#include <highgui.h>
#include <cv.h>
int main(int argc, char *argv[])
{
    CvCapture* capture = cvCaptureFromCAM(0);
    IplImage *src_img;
    IplImage *red_img;
    IplImage *green_img;
    IplImage *blue_img;
    int hist_size = 256;
    float range[] = {0,256};
    float *ranges[] = {range};
    CvHistogram* hist_red = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_blue = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_green = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    int i;
    double find_r[256];
    double find_g[256];
    double find_b[256];
    while(1)
    {
        src_img=cvQueryFrame(capture);
        blue_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        green_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        red_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        cvCvtPixToPlane( src_img, blue_img, green_img, red_img, 0 );
        cvSetImageROI(red_img, cvRect(0,0,50,50));
        cvSetImageROI(blue_img, cvRect(0,0,50,50));
        cvSetImageROI(green_img, cvRect(0,0,50,50));
        cvCalcHist( &red_img, hist_red, 0, NULL );
        cvCalcHist( &blue_img, hist_blue, 0, NULL );
        cvCalcHist( &green_img, hist_green, 0, NULL );
        cvResetImageROI(red_img);
        cvResetImageROI(blue_img);
        cvResetImageROI(green_img);
        for(i = 0; i < hist_size; i++ )
        {
            find_r[i] = cvQueryHistValue_1D(hist_red,i);
            find_b[i] = cvQueryHistValue_1D(hist_blue,i);
            find_g[i] = cvQueryHistValue_1D(hist_green,i);
            }
        }
        cvWaitKey(33);
        cvReleaseImage(&src_img);
        cvReleaseImage(&red_img );
        cvReleaseImage(&green_img );
        cvReleaseImage(&blue_img );
    }
    return 0;
}
Вывод:

C++
1
2
3
4
First-chance exception at 0x00007FFFBCDB5BF8 in openCVex.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000BA153EDD30.
First-chance exception at 0x00007FFFBCDB5BF8 in openCVex.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000BA153EDD30.
Unhandled exception at at 0x00007FFFBCDB5BF8 in openCVex.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000BA153EDD30.
Программа "[2072] openCVex.exe" завершилась с кодом 0 (0x0).
И да: я знаю, что давным-давно есть cv2.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2014, 22:32
Ответы с готовыми решениями:

OpenCv. Получить зеркальное отображение изображения, используя функции: CvScalar, CvGet2D, CvSet2D
Доброго времени суток. Прошу помощи в написании кода. Нужно сделать зеркальное отображение изображения, используя только эти функции:...

OpenCV, рисование гистограммы изображение используя потоки
Необходимо создать приложение, вычисляющее гистограмму изображения с указанной спецификацией:Приложение работает последовательно или...

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

6
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2014, 01:26
Со скобками какая-то путаница. Что за бесконечный цикл while()?

Добавлено через 1 час 3 минуты
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
#include <highgui.h>
#include <cv.h>
 
int main(int argc, char *argv[])
{
    IplImage* img = cvLoadImage("2.jpg"); // какой нибудь файл с изовбражением в папке проекта
    if (!img)
        return 0;
    
    cvNamedWindow("Example", CV_WINDOW_AUTOSIZE); // без окна cvWaitKey() не будет работать
    cvShowImage("Example", img);
    
    CvCapture* capture = cvCaptureFromCAM(0);
    IplImage *src_img;
    IplImage *red_img;
    IplImage *green_img;
    IplImage *blue_img;
    int hist_size = 256;
    float range[] = {0,256};
    float *ranges[] = {range};
    CvHistogram* hist_red = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_blue = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_green = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    int i;
    double find_r[256];
    double find_g[256];
    double find_b[256];
    while(1)
    {
        src_img=cvQueryFrame(capture);
        blue_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        green_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        red_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        cvCvtPixToPlane( src_img, blue_img, green_img, red_img, 0 );
        cvSetImageROI(red_img, cvRect(0,0,50,50));
        cvSetImageROI(blue_img, cvRect(0,0,50,50));
        cvSetImageROI(green_img, cvRect(0,0,50,50));
        cvCalcHist( &red_img, hist_red, 0, NULL );
        cvCalcHist( &blue_img, hist_blue, 0, NULL );
        cvCalcHist( &green_img, hist_green, 0, NULL );
        cvResetImageROI(red_img);
        cvResetImageROI(blue_img);
        cvResetImageROI(green_img);
        for(i = 0; i < hist_size; i++ )
        {
            find_r[i] = cvQueryHistValue_1D(hist_red,i);
            find_b[i] = cvQueryHistValue_1D(hist_blue,i);
            find_g[i] = cvQueryHistValue_1D(hist_green,i);
            
        }
        char ch = cvWaitKey(); // ожидание нажатия клавиши
        if (ch == 27) // если нажата ESC - выход из цикла
            break;
        
    }
    cvReleaseImage(&src_img);
    cvReleaseImage(&red_img );
    cvReleaseImage(&green_img );
    cvReleaseImage(&blue_img );
    
    cvReleaseImage(&img);
    cvDestroyWindow("Example");
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 3
15.09.2014, 04:33  [ТС]
На 42ой строчке закралась лишняя скобка, видно даже по форматированию.
А насчет цикла, я беру кадр с камеры Device0: "cvQueryFrame(capture)", где "capture = cvCaptureFromCAM(0)", т.е. программа получает новые кадры в реальном времени и для каждого получает гистограмму. Далее ее надо будет немного обработать, но это уже другой вопрос, пока надо их получить.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2014, 05:15
Вот это нужно вынести из цикла:
C++
1
2
3
4
5
cvReleaseImage(&src_img); // если это не вынести из цикла, будет исключение при второй итерации,
                         //  в этой строке: src_img = cvQueryFrame(capture); 
       
cvReleaseImage(&img);
cvDestroyWindow("Example");
Я всё вынес, но тогда память утекает.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
15.09.2014, 10:37
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это нужно вынести из цикла
зачем если в цикле создается изображение?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2014, 17:22
Цитата Сообщение от aLarman Посмотреть сообщение
зачем если в цикле создается изображение?
Пускай создаётся. Отсутствие освобождения ресурса в цикле мешает этому? Я этой библиотеки не знаю, смотрю по работе.
Цитата Сообщение от alsav22 Посмотреть сообщение
// если это не вынести из цикла, будет исключение при второй итерации,
//в этой строке: src_img = cvQueryFrame(capture);
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2014, 18:04
У меня, вот этот код, работает нормально (делает захват с USB веб-камеры), и не жрёт ресурсы:
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
#include <highgui.h>
#include <cv.h>
 
int main(int argc, char *argv[])
{
    IplImage* img = cvLoadImage("2.jpg"); // какой нибудь файл с изовбражением в папке проекта
    if (!img)
        return 0;
    
    cvNamedWindow("Example", CV_WINDOW_AUTOSIZE);
    cvShowImage("Example", img);
    
    CvCapture* capture = cvCaptureFromCAM(200);
    IplImage *src_img;
    IplImage *red_img;
    IplImage *green_img;
    IplImage *blue_img;
    int hist_size = 256;
    float range[] = {0,256};
    float *ranges[] = {range};
    CvHistogram* hist_red = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_blue = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    CvHistogram* hist_green = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    int i;
    double find_r[256];
    double find_g[256];
    double find_b[256];
    while(1)
    {
        src_img = cvQueryFrame(capture);
        cvShowImage("Example", src_img);
        blue_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        green_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        red_img = cvCreateImage( cvGetSize(src_img), IPL_DEPTH_8U, 1 );
        cvCvtPixToPlane( src_img, blue_img, green_img, red_img, 0 );
        cvSetImageROI(red_img, cvRect(0,0,50,50));
        cvSetImageROI(blue_img, cvRect(0,0,50,50));
        cvSetImageROI(green_img, cvRect(0,0,50,50));
        cvCalcHist( &red_img, hist_red, 0, NULL );
        cvCalcHist( &blue_img, hist_blue, 0, NULL );
        cvCalcHist( &green_img, hist_green, 0, NULL );
        cvResetImageROI(red_img);
        cvResetImageROI(blue_img);
        cvResetImageROI(green_img);
        for(i = 0; i < hist_size; i++ )
        {
            find_r[i] = cvQueryHistValue_1D(hist_red,i);
            find_b[i] = cvQueryHistValue_1D(hist_blue,i);
            find_g[i] = cvQueryHistValue_1D(hist_green,i);
        }
        char ch = cvWaitKey(10); // ожидание нажатия клавиши
        if (ch == 27) // если нажата ESC - выход из цикла
            break;
        
        cvReleaseImage(&red_img );
        cvReleaseImage(&green_img );
        cvReleaseImage(&blue_img );
    
    }
    cvReleaseImage(&src_img);
    
    cvReleaseImage(&img);
    cvDestroyWindow("Example");
 
    return 0;
}
Миниатюры
OpenCV: получить гистограммы каналов для области изображения  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2014, 18:04
Помогаю со студенческими работами здесь

Opencv для Python: сопоставление изображения с камеры
Когда пытаюсь запустить вот этот код import numpy as np import cv2 cap = cv2.VideoCapture(0) img1 =...

Эквализация гистограммы изображения
В результате эквализации гистограммы на носу появляются черные пятна. Где косяк?) public Bitmap equalizing(Bitmap bmp) { ...

Нормировка гистограммы изображения
Необходимо выполнить нормировку гистограммы по оси Y. Изображение bmp, 8 битное, градации серого public Bitmap histo(Bitmap bmp, Chart...

Построение гистограммы общей яркости изображения
Здравствуйте. Подскажите, как построить гистограмму общей яркости изображения в элементе Chart из объекта Bitmap или двумерного массива...

Построение 3-х мерного графика изображения и его гистограммы
Доброго времени суток! Нужна помощь. Суть проблемы такова: Есть полноцветное изображение, нужно каким-то образом сделать так, чтобы...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru