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