2

Visual C ++Express2010とOpenCV2.3.1を使用してRGB画像をHSI色空間に変換しようとしていますが、これでコンパイルエラーの問題が発生します。誰かがこれを手伝ってくれますか?マトリックスを使用して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;
};
4

2 に答える 2

0

なぜこれを使わないのですか:

cvtColor(img_rgb,img_hsv,CV_RGB2HSV);

また、 RGB から HSV への OpenCV 画像変換も参照してください。

于 2012-12-19T10:50:25.580 に答える
0

コンパイル エラーは発生しません。ただし、プログラムを実行するには、次の変更を加える必要がありました。

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

それがopencvがメモリを整理する方法であるため、切り替える必要がiありました。jまた、RGB 値が 3 つあるため、ピクセルごとに 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;
于 2012-12-19T11:49:20.937 に答える