opencv BGR成分を指定し、該当するピクセルの位置を表示させる
トラックバー1,2,3を使用します。
トラックバー1,2,3がそれぞれB,G,Rの値を指定します。
トラックバー1、2、3で指定したBGR成分を持つピクセルの色情報の座標をforループと、if文で探しprintfで表示させます。
私が作成したプログラムだとコンパイルは通りますが、BGR=(0,0,0)の時にのみ、x=0~254y=0~254が羅列されますが、上記の動作をしてくれません。
どなたかアドバイスお願いします。
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
/* グローバル変数 */
CvFont font;
IplImage *img;
int B = 0;
int G = 0;
int R = 0;
uchar p[3];
void on_trackbar1 (int val1);
void on_trackbar2 (int val2);
void on_trackbar3 (int val3);
int main (int argc, char *argv[])
{
img = cvLoadImage ( "bgr2.jpg", CV_LOAD_IMAGE_COLOR);
cvInitFont (&font, CV_FONT_HERSHEY_DUPLEX, 1.0, 1.0);
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);
cvCreateTrackbar ("B", "Image", 0, 255, on_trackbar1);
cvCreateTrackbar ("G", "Image", 0, 255, on_trackbar2);
cvCreateTrackbar ("R", "Image", 0, 255, on_trackbar3);
cvShowImage( "Image", img);
cvWaitKey (0);
cvDestroyWindow ("Image");
cvReleaseImage (&img);
return 0;
}
void on_trackbar1 (int val1)
{
printf ("B=%d G=%d R=%d %d %d %d\n ", B,G,R,p[0],p[1],p[3] );
B = val1;
char str [64];
int x, y;
for (y = 0; y < img->height; y++) {
for (x = 0; x < img->width; x++) {
((uchar*)(img->imageData + img->widthStep*y))[x*3]=p[0];
((uchar*)(img->imageData + img->widthStep*y))[x*3+1]=p[1];
((uchar*)(img->imageData + img->widthStep*y))[x*3+2]=p[2];
if ((p[0] == B) && (p[1] == G) && (p[2] == R)) {
printf ("X=%d Y=%d %d %d %d\n ", y, x, p[0],p[1],p[3] );
}
}
}
}
void on_trackbar2 (int val2)
{
printf ("B=%d G=%d R=%d %d %d %d\n ", B,G,R,p[0],p[1],p[3] );
G = val2;
char str [64];
int x, y;
for (y = 0; y < img->height; y++) {
for (x = 0; x < img->width; x++) {
((uchar*)(img->imageData + img->widthStep*y))[x*3]=p[0];
((uchar*)(img->imageData + img->widthStep*y))[x*3+1]= p[1];
((uchar*)(img->imageData + img->widthStep*y))[x*3+2]=p[2];
if ((p[0] == B) && (p[1] == G) && (p[2] == R)) {
printf ("X=%d Y=%d %d %d %d\n", y, x, p[0],p[1],p[2] );
}
}
}
}
void on_trackbar3 (int val3)
{
printf ("B=%d G=%d R=%d %d %d %d\n ", B,G,R,p[0],p[1],p[2] );
R = val3;
char str [64];
int x, y;
for (y = 0; y < img->height; y++) {
for (x = 0; x < img->width; x++) {
((uchar*)(img->imageData + img->widthStep*y))[x*3]=p[0];
((uchar*)(img->imageData + img->widthStep*y))[x*3+1]=p[1];
((uchar*)(img->imageData + img->widthStep*y))[x*3+2]=p[2];
if ((p[0] == B) && (p[1] == G) && (p[2] == R)) {
printf ("X=%d Y=%d %d %d %d\n", y, x, p[0],p[1],p[2] );
}
}
}
}
お礼
回答 ありがとうございます (株)秋月電子通商は無いようなので ダイセン電子工業にメールで問い合わせてみます