2

我想使用visual C++ express 2010將RGB圖像轉換爲HSI顏色空間並打開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。參見[Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV)。 –

0

我沒有得到一個編譯錯誤。但我需要做以下修改,讓您PROGRAMM運行:

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

,我必須改ij,因爲這是OpenCV的方式組織的內存。此外,由於3個rgb值,您需要每像素提前3個字節。

將下一行的大括號移動到ifstream f("file.txt");以上的行中。否則,您只會計算圖像最後一行的值。

刪除此行(我不知道,什麼是應該做的):

ifstream f("file.txt"); 

而且裏面的for循環添加以下只是以可視化的結果,因爲到目前爲止,你是不是做任何計算結果:

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

編譯錯誤是「圖像coversion.exe中的0x771fc41f處未處理的異常:Microsoft C++異常:cv ::內存位置0x0037e56c處的異常」圖像轉換是我的項目名稱 – Rose

+0

您所說的「在循環內部添加了一些可視化內容結果」?並通過我添加「ifstream f(」file.txt「);」並沒有完成編寫錯誤的代碼,我稍後將使用它將R,G和B的值寫入一個txt文件中,之後發現H,S和II的值也會將它們寫入另一個txt文件。預先感謝您在程序當前狀態下的幫助 – Rose

+0

,HSI值是經過計算但未使用的。因此,爲了確定計算是否成功或產生虛假結果,我只是將它們寫回圖像中以將它們可視化爲RGB值。只需快速檢查一下結果是否合理。 – sietschie