

カメラを付けたarduinoから画像の情報が送られてきて、それをpoint()で表示させるプログラムをprocessingで書いたのですが、画像を完全に表示し終わってから、もう一度画像を表示させると前回撮影した画像の残像が残ってしまいます。

下記のコードでは画像を表示し始める前に、グラデーションの画像を作成し、表示させてから撮影した画像を表示させています。

background(0);を使って初期化することも行ったのですが、  
background(255);と  
background(0);  
のように初期化する背景色によっても表示させる画像の色合いに影響が出てしまいます。
背景色を赤っぽくすれば画像も赤っぽくなりますし、背景色を青っぽくすれば画像も青っぽくなります。
1ピクセルずつに塗りつぶしていて影響がないはずなのになぜこのような現象が起こるのでしょうか？

[![画像の説明をここに入力](https://i.stack.imgur.com/rEXTD.png)](https://i.stack.imgur.com/rEXTD.png)[![画像の説明をここに入力](https://i.stack.imgur.com/jPWLg.png)](https://i.stack.imgur.com/jPWLg.png)

[code]

    import processing.serial.*;
    
    Serial port;
    
    int start=0;
    
    int h=240;
    int w=320;
    int count=0;
    int pixel=0;
    
    void setup()
    {
      size(320, 240);
      port = new Serial(this, "COM4", 1000000);
      frameRate(300000);
      stroke(0);
      rectMode(CENTER);
    }
    
    void keyPressed() {
      port.write(key);
    }
    
    void draw()
    {  
    
      // シリアルポートからデータを受け取ったら
      if (port.available() > 0 ) {
        int c=port.read();
        if (c==118) { //v
          start=1;
          println("start");
          //background(255);
    
          //グラデーション背景色確かめ
          for (int i=0; i<h; i++) {
            for (int j=0; j<w; j++) {
              stroke(color(i, j, j));
              point(j, i);
            }
          }
        } else if (c==122) { //z
          println("end");
          println("count");
          println(count);
          count=0;
          start=0;
        } else if (start>0) {
          count=count+1;
    
          String s=str(char(c));
          int f=unhex(s);
          //println(hex(f));
    
          if ((count)%4==1)pixel += f*4096;
          if ((count)%4==2)pixel += f*256;
          if ((count)%4==3)pixel += f*16;
    
          if ((count)%4==0) {
            pixel += f;
    
            int R=0;
            int G=0;
            int B=0;
    
            if (pixel%2==1)G+=32;
            if ((pixel>>1)%2==1)G+=65;
            if ((pixel>>2)%2==1)G+=130;
            if ((pixel>>3)%2==1)R+=8;
            if ((pixel>>4)%2==1)R+=16;
            if ((pixel>>5)%2==1)R+=33;
            if ((pixel>>6)%2==1)R+=66;
            if ((pixel>>7)%2==1)R+=132;
            if ((pixel>>8)%2==1)B+=8;
            if ((pixel>>9)%2==1)B+=16;
            if ((pixel>>10)%2==1)B+=33;
            if ((pixel>>11)%2==1)B+=66;
            if ((pixel>>12)%2==1)B+=132;
            if ((pixel>>13)%2==1)G+=4;
            if ((pixel>>14)%2==1)G+=8;
            if ((pixel>>15)%2==1)G+=16;
    
            int x=16;
    
            stroke(color(R, G, B));
            point((count-132)/4%320, (count-132)/4/320);
            pixel=0;
          }
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2021-01-30T12:49:04.943
73702
2021-02-13T13:01:23.067
2021-01-30T13:50:53.373
43752
43752
question
processing
Processingでpoint()で画像を表示させたあともう一度表示させると前の画像の残像が残ってしまう。


arduino を現在持っていないので、確認することができませんが、  
この現象は arduino は関係なく processing の特徴（？）ではないでしょうか？

[code]

    void draw() {
      background(0);
    
      以下略
    
[/code]

というようにバックグラウンドをクリアする命令を draw() の中に入れてみてください。  
前の状態がクリアされます。

参考までに  
[Processing入門6](http://www.cp.cmc.osaka-u.ac.jp/%7Ekikuchi/kougi/simulation2009/processing6.html)  
にも前に描いたものが残ることが記載されています。

もしくは、drawのはじめに入れるのではなく、やりたいことに応じて

`background(0);`

を適切な箇所にいれる必要があるかもしれません。


CC BY-SA 4.0
2021-01-30T13:14:50.430
73704
2021-01-30T13:35:04.087
2021-01-30T13:35:04.087
9008
9008
73702
answer


> もう一度画像を表示させると前回撮影した画像の残像が残ってしまいます。

特に消す処置をしなかったのなら、むしろ消える要素がありません。コンピュータの描画は、新しい紙を用意するようなものではなく、以前書いた紙に上から新しい画を描くように行われます。上から描き直した部分以外は以前の画が残っている方が正常と思います。

> background(0);を使って初期化することも行ったのですが、

初期化というとちょっと違うかと思いますがともかく、background()を実行した後も画像が残っていたのですか?
そんなことはないと思います。明記されていませんが、それ以降は、「残像が残っています」とは全く別の現象の記述かと思いますがあっていますでしょうか。

> 背景色を赤っぽくすれば画像も赤っぽくなりますし、背景色を青っぽくすれば画像も青っぽくなります。 1ピクセルずつに塗りつぶしていて影響がないはず

まさに、そんなことはないはず、です。人間の目は結構いいかげんです。強い色の赤い部分や青い部分に感覚が引きずられてしまって、画像部分が赤い/青いように「見えている」だけではないですか?  
PCのスクリーンキャプチャ等で画像を記録して、青い時赤い時(あるいは黒のとき白の時)それぞれのキャプチャについて画素レベルで比べてみたらどうなっているでしょうか。


CC BY-SA 4.0
2021-02-13T13:01:23.067
73974
2021-02-13T13:01:23.067
43952
73702
answer