Ask Your Question

Revision history [back]

Opencv with visual C++2010

#include<stdio.h>

include<string.h>

int main(void){

char img_name1[]="";
char img_name2[]="";
printf("画像1をドロップしてください\n");
scanf("%s", img_name1);
printf("画像2をドロップしてください\n");
scanf("%s", img_name2);

// 画像の読み込み
int x2 = 0;
cv::Mat srcImg = cv::imread(img_name1);
printf("gray_img");
cv::Mat gray_img;
printf("グレースケール");
// グレースケールに変換する
cvtColor(srcImg, gray_img, CV_RGB2GRAY);
printf("Mat gray_img_B");
cv::Mat gray_img_B;
// グレースケールに変換する
cvtColor(srcImg, gray_img_B, CV_RGB2GRAY);

cv::Mat srcImg2 = cv::imread(img_name2);
cv::Mat gray_img2;
// グレースケールに変換する
cvtColor(srcImg2, gray_img2, CV_RGB2GRAY);





int count = gray_img_B.rows*gray_img_B.cols;
int color[20000];
int color2[20000];
int color_S[20000];

int hist_G[20000];    //ヒストグラム
int hist_G_S[20000];    //ヒストグラム
int hist_G2[20000];    //ヒストグラム
int hist_G2_S[20000];    //ヒストグラム
int x, y;

//*******************************************
//*               濃淡変換                    *
//*******************************************
x2 = 0;
for (y = 0; y < gray_img.rows; y++) {
    // ポインタの取得
    for (x = 0; x < gray_img.cols; x++) {
        color_S[x2] = gray_img.at<unsigned char>(x, y);

        //符号計算
        if (color_S[x2] >= 0)
            color_S[x2] = 0 - color_S[x2];
        if (color_S[x2]<0)
            color_S[x2] = 0 + color_S[x2];
        gray_img.at<uchar>(x, y) = color_S[x2];
        x2++;

    }
}
cv::namedWindow("入力画像", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::namedWindow("出力画像", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::imshow("入力画像", srcImg);
cv::imshow("出力画像", gray_img);
cv::waitKey(2000);

// 指定したウィンドウを消す
cv::destroyWindow("出力画像");


printf("処理中\n");
//************************************************************************************
x2 = 0;
//*******************************************
//*               値取得                     *
//*******************************************
printf("1\n");
for (y = 0; y < gray_img_B.rows; y++) {
    // ポインタの取得
    for (x = 0; x < gray_img_B.cols; x++) {
        color[x2] = gray_img_B.at<unsigned char>(x, y);
        x2 = x2 + 1;

    }
}

y = 0;

//初期化
for (x = 0; x<count; x++){
    hist_G[x] = 0;
}


bool flag = true;
x2 = 0;

//*******************************************
//*         ヒストグラム作成                   *
//*******************************************
printf("ヒストグラム1\n");
while (flag == true){
    if (color[y] == color[x2]){
        hist_G[y]++;
        x2++;
        y = 0;
        if (x2>count)
            flag = false;
    }
    y++;
}

y = 0;
for (x = 0; x<x2; x++){
    if (hist_G[x]>0){
        hist_G_S[y] = hist_G[x];
        y++;
    }
}



//************************************************************************************


flag = true;
//************************************************************************************
x2 = 0;
//*******************************************
//*               値取得                     *
//*******************************************
printf("2\n");
for (y = 0; y < gray_img_B.rows; y++) {
    // ポインタの取得
    for (x = 0; x < gray_img_B.cols; x++) {
        color2[x2] = gray_img2.at<unsigned char>(x, y);
        x2 = x2 + 1;

    }
}
y = 0;

//初期化
for (x = 0; x<count; x++){
    hist_G2[x] = 0;
}



x2 = 0;

//*******************************************
//*         ヒストグラム作成                   *
//*******************************************
printf("ヒストグラム2\n");
while (flag == true){
    if (color2[y] == color2[x2]){
        hist_G2[y]++;
        x2++;
        y = 0;

        if (x2>count)
            flag = false;
    }
    y++;
}
y = 0;
for (x = 0; x<x2; x++){
    if (hist_G2[x]>0){
        hist_G2_S[y] = hist_G2[x];
        y++;
    }
}
//************************************************************************************


int sum_count[20000];
int sum_count_C = 0;
int num = 0;
float sum_count_C2;
for (x = 0; x<x2; x++){
    sum_count[x] = hist_G_S[x] - hist_G2_S[x];
    sum_count[x] = abs(sum_count[x]);
}

//平均値
for (x = 0; x<x2; x++){
    sum_count_C = sum_count_C + sum_count[x];
}
sum_count_C2 = sum_count_C / x2;
sum_count_C2 = 100 - sum_count_C2;
printf("類似度:%f", sum_count_C2);

return 0;

}

above code cause error.

why?


画像1をドロップしてください C:\Users\user1\Desktop\nCJKAl-388x242.jpg 画像2をドロップしてください C:\Users\user1\Desktop\nCJKAl-388x242.jpg ガゾウヨミコミgray_imgグレースケールOpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\imgproc\src\color.cpp, line 3739 続行するには何かキーを押してください . . .