#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 続行するには何かキーを押してください . . .