我正在尝试使用visual c ++ express 2010将RGB图像转换为HSI颜色空间并打开CV 2.3.1并编译错误问题。请任何人都可以帮助我,我需要知道如何使用矩阵来保存H,S和I的值。提前感谢。 我使用的代码是。
#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 :(得分:0)
答案 1 :(得分: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 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;