BGRを求め、csvに出力するまでは実装できたのですが、画像サイズより大きい位置を指定した場合も、
値が抽出されてしまいます。また、この値が一定であればまだわかるのですが、バラバラであり、
何を示しているのかわからない状態です。
教えて頂きたいこと
①画像サイズより大きい位置の値を入力したとき、エラー処理をだす。
もしくは、実行できてもよいが、値を一定にし、分かりやすいようにしたい。
②全体的に直したほうがよいところ、間違っているところについて。
ご教授お願いします。
[version]
opencv3.1.0
vs2013
#include<iostream>
#include<opencv/cv.h>
#include<opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<fstream>
#include<stdio.h>
using namespace std;[attachment=0]位置と値.PNG[/attachment][attachment=0]位置と値.PNG[/attachment][attachment=0]位置と値.PNG[/attachment]
using namespace cv;
IplImage *img;
int main(int argc, char **argv)
{
FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
errno_t error;
int x, y;
int count1 = 0, count2 = 0, count3 = 0;
//領域1
uchar q[3];
//領域2
uchar r[3];
//全画素
uchar p[3];
//ある領域の輝度値/////////////////////////////////////////////////
int value;
//領域1// //領域2//
//開始位置 開始位置
int y1 = 0, x1 = 0; int y2 = 1987, x2 = 1987;
//幅 幅
int a1 = 3; int b1 = 0;
//高さ 高さ
int a2 = 200; int b2 = 0;
////////////////////////////////////////////////////////////////////
int height1 = y1 + a1,
width1 = x1+a2,
height2 = y2 + b1,
width2 = x2 + b2;
//読み込む画像
//img = cvLoadImage(("1.png"), CV_LOAD_IMAGE_COLOR);
img = cvLoadImage(("R2.png"), CV_LOAD_IMAGE_GRAYSCALE);
if ((error = fopen_s(&fp1, "位置1.csv", "w"))){
return 0;
}
if ((error = fopen_s(&fp2, "value1.csv", "w"))){
return 0;
}
//領域1の(B,G,R)を順次取得
printf("領域1");
for (y = y1; y < height1; y++) {
for (x = x1; x < width1; x++) {
// BGRの取得
printf("位置(%d,%d)\n",y,x);
q[0] = img->imageData[img->widthStep * y + x * 3]; // B
q[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G
q[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R
printf("B:G:R");
printf("(%d,", q[0]);
printf("%d,", q[1]);
printf("%d)\n", q[2]);
count2++;
if (count2 % 10 != 0){
//位置
fprintf(fp1, ",(x:%d/y:%d),,",y,x);
//値
fprintf(fp2, "%d,%d,%d,", q[0], q[1], q[2]);
}
else{
//位置
fprintf(fp1, ",(x:%d/y:%d),\n", y,x);
//値
fprintf(fp2, "%d,%d,%d\n", q[0], q[1], q[2]);
}
}
}
// 領域2の(B,G,R)を順次取得
for (y = y2; y < height2; y++) {
for (x = x2; x < width2; x++) {
// BGRの取得
printf("位置(%d,%d)\n", y, x);
r[0] = img->imageData[img->widthStep * y + x * 3]; // B
r[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G
r[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R
printf("B:G:R");
printf("(%d,", r[0]);
printf("%d,", r[1]);
printf("%d)\n", r[2]);
count3++;
}
}
/*
//全画素(B,G,R)を順次取得
for (y = 0; y < img->height; y++) {
for (x = 0; x < img->width; x++) {
// BGRの取得
// 画素値を直接操作する一例
p[0] = img->imageData[img->widthStep * y + x * 3]; // B
p[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G
p[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R
printf("B:G:R");
printf("(%d,", p[0]);
printf("%d,", p[1]);
printf("%d)\n", p[2]);
count1++;
//BGRの設定
img->imageData[img->widthStep * y + x * 3] = cvRound (p[0] * 0.6 + 10);
img->imageData[img->widthStep * y + x * 3 + 1] = cvRound (p[1] * 1.0);
img->imageData[img->widthStep * y + x * 3 + 2] = cvRound (p[2] * 0.0);
}
}
*/
printf("領域1の総数:%d\n", count2);
printf("領域2の総数:%d\n", count3);
printf("全画素の総数:%d\n", count1);
cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
cvShowImage("Image", img);
cvWaitKey(0);
cvDestroyWindow("Image");
cvReleaseImage(&img);
fclose(fp1);
fclose(fp2);
//fclose(fp3);
//fclose(fp4);
//fclose(fp5);
//fclose(fp6);
return 0;
}