opencvで特定の座標を指定しその座標の色変換
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
/* グローバル変数 */
CvFont font;
IplImage *img;
int num1=0;
int num2=0;
int num3=0;
int num4=0;
/* プロトタイプ宣言 */
void on_trackbar1 (int val1);
void on_trackbar2 (int val2);
void on_trackbar3 (int val3);
void on_trackbar4 (int val4);
int main (int argc, char *argv[])
{
img = cvLoadImage ( "bgr.jpg", CV_LOAD_IMAGE_COLOR);
cvInitFont (&font, CV_FONT_HERSHEY_DUPLEX, 1.0, 1.0);
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);
cvCreateTrackbar ("X", "Image", 0, 255, on_trackbar1);
cvCreateTrackbar ("Y", "Image", 0, 255, on_trackbar2);
cvCreateTrackbar ("COLOR", "Image", 0, 255, on_trackbar3);
cvCreateTrackbar ("-", "Image", 0, 100, on_trackbar4);
cvShowImage ("Image", img);
int x,y;
uchar p[3];
for (y = 0; y < img->height; y++) {
for (x = 0; x < img->width; x++) {
p[0] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3]; // B
p[1] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3+1]; // G
p[2] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3+2]; // R
p[0] = num3;
p[1] = num3;
p[2] = num3;
}
}
cvWaitKey (0);
cvDestroyWindow ("Image");
cvReleaseImage (&img);
return 0;
}
/* コールバック関数 */
void on_trackbar1 (int val1)
{
num1 = val1;
char str[64];
printf ( "X=%d Y=%d C=%d -=%d\n", val1, num2, num3, num4);
}
void on_trackbar2 (int val2)
{
num2 = val2;
char str [64];
printf ( "X=%d Y=%d C=%d -=%d\n", num1, val2, num3, num4);
}
void on_trackbar3 (int val3)
{
num3 = val3;
char str [64];
printf ( "X=%d Y=%d C=%d -=%d\n", num1, num2, val3, num4);
}
void on_trackbar4 (int val4)
{
num4 = val4;
char str [64];
printf ( "X=%d Y=%d C=%d -=%d\n", num1, num2, num3, val4);
}
このプログラムで特定の座標の色変換をしたいのですがうまくいきません。
トラックバー1でX座標
トラックバー2でY座標
トラックバー3で変更後の色
を指定します。
実行すると画像は表示されますがトラックバーを動かしても変化がありません。トラックバーを動かした時にmain関数に戻れば良いと思い、思いつく限り試しましたが上手くいきません。
どなたかアドバイスお願いします。
補足
返答どうもありがとうございます. おっしゃる通り,値が与えられますね. そもそもポインタの初期化をした理由は はじめにSegmentation faultしたためです. 原因を調べた際に,初期化をしないと ポインタが示すアドレスがかぶることがある云々 とあったためです. しかしすべてに&pではまずいですね. この場合は必要ないということでしょうか. ちなみに返答にありました通り,初期化をコメントアウトして 行いましたがどうも並列化の恩恵はありませんでした. また,オプションに関してですが,今回のgccが まだ-mfloat-abi=hardをサポートしていないため -mfloat-abi=softfpを指定しております. http://blog.kmckk.com/archives/1565251.html -mhard-floatをつけると暗黙のうちに -mfloat-abi=hard になりますが、現状ARMのコンパイラではfloatのABIでhardはサポートされていません。なので、必ず -mhard-float を指定したら -mfloat-abi=softfp も指定する必要があります。 次にでてくるgcc 4.5 ではARMでの-mfloat-api=hardがサポートされるようです。