

開発環境：arduino IDE  
ボード ：Spresense

video streamによって取得したQVGAのYUV422画像に対して、クリップ処理のみを行う方法を模索してみましたが、解決に至っていません。

下記の関数が実際に画像サイズ変更を行うことができることと、URL先資料の14pより、「リサイズ時の倍率は2^n倍もしくは1/2^n倍、リサイズ後のサイズは整数」という制約があることまでは認識しています。  

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

**・ CamErr CamImage::resizeImageByHW**  
画像のリサイズ

**・ CamErr CamImage::clipandResizeImageByHW**  
画像のクリップ ＋ リサイズ

  
URL：Spresense Study meeting#1 How to use the Camera board  
<https://www.slideshare.net/YoshinoriOota/spresense-study-meeting1-how-to-use-
the-camera-board>

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝  

このことから下記のコードでクリップ機能のみでの動作チェックを試しています。  
  
コード概要：QVGA(320,240) -クリップ→ (60,60) -リサイズ→ (60,60)

[code]

    　CamImage small;
      CamErr err = img.clipAndResizeImageByHW(small　//img:video stream画像
                   , 48, 8
                   , 107, 67
                   , 60, 60);            
      if (err) 
      { 
          Serial.println("ERROR: " + String(err)); 
          return; 
      }
      if (!small.isAvailable()) 
      { 
          Serial.println("clipAndResize failed");
          return; 
      } 
    
[/code]

実際にシリアルモニタにて動作確認を行いましたが、エラーコードの表示もなされず、  
n=0の場合だと正しく動作しません。  
※QVGA(320,240) -クリップ→ (120,120) -リサイズ→ (60,60)のような  
n=1等の場合での正常動作は確認しています。  

clipAndResizeImageByHWはcamera.cppで定義されており、下記の通りです。  
下記コードより、imageproc_clip_and_resizeが今回着目したい処理部であると踏んでいますが、この関数に関してはヘッダーしか見当たらず、定義を見るまでには至っていません。  

[code]

        CamErr CamImage::clipAndResizeImageByHW(
        CamImage &img,
        int lefttop_x,
        int lefttop_y,
        int rightbottom_x,
        int rightbottom_y,
        int width,
        int height)
    {
      int clip_width, clip_height;
      imageproc_rect_t inrect;
    
      // Input instance must not be Capture Frames.
      if((img.is_valid()) && (img.img_buff->cam_ref != NULL))
        {
          return CAM_ERR_INVALID_PARAM;
        }
    
      // Format check.
      if( getPixFormat() != CAM_IMAGE_PIX_FMT_YUV422 )
        {
          return CAM_ERR_INVALID_PARAM;
        }
    
      clip_width  = rightbottom_x - lefttop_x + 1;
      clip_height = rightbottom_y - lefttop_y + 1;
    
      // Check clip area.
      if( (lefttop_x   < 0) || (lefttop_x  > rightbottom_x) ||
          (lefttop_y   < 0) || (lefttop_y  > rightbottom_y) ||
          (clip_width  < 0) || (clip_width  > getWidth())   ||
          (clip_height < 0) || (clip_height > getHeight()) )
        {
          return CAM_ERR_INVALID_PARAM;
        }
    
      // HW limitation check.
      if( !check_hw_resize_param( clip_width, clip_height, width, height ) )
        {
          return CAM_ERR_INVALID_PARAM;
        }
    
      CamImage *tmp_img = new CamImage(V4L2_BUF_TYPE_VIDEO_CAPTURE, width, height, getPixFormat(), NULL);
      if( tmp_img == NULL || !tmp_img->is_valid() )
        {
          if(tmp_img != NULL) delete tmp_img;
          return CAM_ERR_NO_MEMORY;
        }
      tmp_img->setActualSize(tmp_img->img_buff->buf_size);
    
      inrect.x1 = lefttop_x;
      inrect.y1 = lefttop_y;
      inrect.x2 = rightbottom_x;
      inrect.y2 = rightbottom_y;
    
      // Execute clip and resize.
      int ret = imageproc_clip_and_resize(getImgBuff(), getWidth(), getHeight(),
                      tmp_img->getImgBuff(), tmp_img->getWidth(), tmp_img->getHeight(), 16, &inrect);
      if( ret != 0 )
        {
          delete tmp_img;
          return CAM_ERR_ILLEGAL_DEVERR;
        }
    
      // if the image has image buffer, delete it.
      if( img.is_valid() )
        {
          ImgBuff::delete_inst(img.img_buff);
        }
    
      // Set resized image buffer into input parameter.
      img.img_buff = tmp_img->img_buff;
      img.img_buff->incRef();
    
      tmp_img->img_buff = NULL;
      delete tmp_img;
    
      return CAM_ERR_SUCCESS;
    }
    
[/code]

  
本件に関してご存じの方いらっしゃいましたらご教授願いたいです。


CC BY-SA 4.0
2020-06-17T02:46:23.183
67748
2020-09-30T01:20:51.740
2020-06-17T04:05:53.360
40664
40664
question
spresense arduino
video streamによって取得した画像に対してクリッピングのみ行う方法


ソニーのSPRESENSEサポート担当です。

クリッピングのみを行う機能について、先日リリースしましたv2.0.2にて対応いたしました。

v2.0.2にバージョンアップを行った上で、お試しください。

今後ともSPRESENSEをどうぞよろしくお願いいたします。  
SPRESENSEサポートチーム


CC BY-SA 4.0
2020-09-30T01:20:51.740
70825
2020-09-30T01:20:51.740
29520
67748
answer