2

Я пытаюсь преобразовать изображение RGB в цветовое пространство HSI с помощью visual C++ express 2010 и открыть CV 2.3.1 и скомпилировать проблему с этим вопросом. Пожалуйста, помогите мне с этим, и мне нужно знать, как использовать матрицу для сохранения значений H, S и I. Спасибо заранее. Коды, которые я использую.конвертировать изображение RGB в цветовое пространство HSI

#include "stdafx.h" 
#include <cmath> 
#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <opencv2/opencv.hpp> 
using namespace std; 

#include "cxcore.h" 
#include "cv.h" 
#include <highgui.h> 
using namespace cv; 

const string openCVpath = string(getenv("ProgramFiles"))+"\\OpenCV-2.3.1\\samples\\c\\"; 

int main (int, char**) { 
    //call image 
    Mat img1 = imread(openCVpath+"image1.jpg"); 
    unsigned char *input = (unsigned char*)(img1.data); 

    // To get pixel values of i-th row and j-th cloumn, 
    double R,G,B,min,H,S,I; 
    int i,j; 
    const double PI= 3.14; 
    for(int i = 0;i < img1.rows ;i++){ 
     for(int j = 0;j < img1.cols ;j++){ 
      B = input[img1.step * j + i ] ; 
      G = input[img1.step * j + i + 1]; 
      R = input[img1.step * j + i + 2]; 
     } 
     // calculate the values of Hue, Saturation and Intensity 
     min = R; 
     if (G < min) 
      min = G; 
     if (B < min) 
      min = B; 
     I = (R+G+B)/3.0; 
     S = 1 - min/I; 
     if (S == 0.0) 
     { 
      H = 0.0; 
     } 
     else 
     { 
      H = ((R-G)+(R-B))/2.0; 
      H = H/sqrt((R-G)*(R-G) + (R-B)*(G-B)); 
      H = acos(H); 
      if (B > G) 
      { 
       H = 2*PI - H; 
      } 
      H = H/(2*PI); 
     } 
    } 
    ifstream f("file.txt"); //...in your routine 
//}; 
imshow("Image",img1); 

    cvWaitKey(0); 
    return 0; 
}; 
+0

В чем именно заключается ошибка компиляции? – sietschie

+0

Это ошибка компиляции. Необработанное исключение в 0x771fc41f в изображении coversion.exe: исключение Microsoft C++: cv :: Исключение в ячейке памяти 0x0037e56c « – Rose

+0

Можете ли вы узнать, где именно происходит исключение? Например, используя отладчик? Или добавив некоторые printfs? – sietschie

ответ

0

почему бы вам не использовать это:

cvtColor(img_rgb,img_hsv,CV_RGB2HSV); 

также см, OpenCV image conversion from RGB to HSV

+1

Они могут звучать одинаково, но технически HSV и HSI не совпадают. HSI эквивалентен HLS. Чтобы преобразовать в HSI, вам нужно использовать 'CV_RGB2HLS' – sgarizvi

+0

Мне нужно преобразовать в цветовое пространство HSI, и это не то же самое с HSV, и мне нужно использовать значения H, S и I, чтобы нарисовать диаграмму – Rose

+0

@sgarizvi, HSI ** не ** эквивалентен HLS. I = (R + G + B)/3, тогда как L = (max (R, G, B) + min (R, G, B))/2. См. [Википедия] (https://en.wikipedia.org/wiki/HSL_and_HSV). –

0

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

B = input[img1.step * i + 3*j ] ; 
G = input[img1.step * i + 3*j + 1]; 
R = input[img1.step * i + 3*j + 2]; 

мне пришлось перейти i и j, потому что это путь OpenCV организует память. Кроме того, вам необходимо продвигать 3 байта на пиксель из-за 3 значений rgb.

Переместите фигурные скобки в следующей строке на линию выше ifstream f("file.txt");. В противном случае вы будете вычислять только значения для последней строки изображения.

удалить эту строку (я не уверен, что он должен делать):

ifstream f("file.txt"); 

И внутри для петель я добавил следующее просто визуализировать результат, потому что до сих пор вы не делаете все вычисленные результаты:

input[img1.step * i + 3*j ] = 255*H; 
input[img1.step * i + 3*j + 1] = 255*S; 
input[img1.step * i + 3*j + 2] = I; 
+0

Ошибка компиляции: «Необработанное исключение в 0x771fc41f в изображении coversion.exe: исключение Microsoft C++: cv :: Исключение в ячейке памяти 0x0037e56c» преобразование изображения - это мое имя проекта – Rose

+0

, что вы подразумеваете под «внутри цикла» вы добавляете кое-что для визуализации результат"? и, кстати, я добавляю «ifstream f (« file.txt »);» и не закончил писать код по ошибке, я буду использовать его позже, чтобы записать значения R, G и B в один файл txt и после поиск значений H, S и II также будет записывать их в другой txt-файл. Заранее спасибо за помощь – Rose

+0

при текущем состоянии вашей программы, значение HSI вычисляется, но не используется. Поэтому для того, чтобы увидеть, удастся ли вычисление или дает фиктивные результаты, я просто написал их обратно в изображение, чтобы визуализировать их как значения RGB. Просто быстрая проверка, чтобы увидеть, являются ли результаты разумными. – sietschie

Смежные вопросы