OpenCV ピクセル単位でRGBの値を変更

これとか
【OpenCV】IplImageの輝度値を参照、設定する 画像処理ソリューション
これ読んだら
なんとなーくIplImageのデータがどんな風に並べられているかわかった。


ので、
opencv.jp - OpenCV: 基本構造体(Basic Structures)サンプルコード -
これをちょちょっといじって、
トラックバーを触るたびに各ピクセルのRGBを順番に入れ替えるようにしてみた。

#include "opencv/cv.h"
#include "opencv/highgui.h"


void Trackbar(int val);

IplImage* img;
//トラックバーの関数から操作するためにグローバル関数に置く

int main(){
    img = cvLoadImage("/Users/ぼくのなまえ/Desktop/ff.jpg", CV_LOAD_IMAGE_COLOR);
    
    cvNamedWindow ("RGBchanger", CV_WINDOW_AUTOSIZE);
    cvShowImage ("RGBchanger",img);
    cvCreateTrackbar("Move it", "RGBchanger", 0, 100, Trackbar);
    cvWaitKey (0);
    cvDestroyWindow("RGBchanger");
    cvReleaseImage(&img);
    
    return 0;
}

uchar p[3];
int x,y;

void Trackbar(int val){
    for (y = 0; y < img->height; y++) {
        for (x = 0; x < img->width; x++) {
            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
            img->imageData[img->widthStep * y + x * 3] = p[1];
            img->imageData[img->widthStep * y + x * 3 + 1] = p[2];
            img->imageData[img->widthStep * y + x * 3 + 2] = p[0];
        }
    }
    cvShowImage ("RGBchanger", img);
}


f:id:highdef:20140222041217g:plain
ビカビカビカビカ






グリッチアートをつくりたいという動機でOpenCVを始めたわけですが、The Wordpad Glith と呼ばれるバイナリデータの文字置き換えによる手法
f:id:highdef:20140211204039p:plain←これ
は、jpgとかpngとかの圧縮画像データだからなるわけで、OpenCVの中ではできないんじゃね?メモ帳使った方が早いんじゃね?