カメラ映像表示

 投稿者:しばっち  投稿日:2019年 9月26日(木)20時10分7秒
  open cvライブラリーを使用して、十進BASIC上でUSBカメラ、内臓カメラ映像を
表示します。※デジカメではありません。


解像度の指定はカメラデバイスが対応した解像度を指定してください。
カメラデバイスが複数ある場合は、IDナンバーを変えると別のカメラ映像が表示できます。

(注意)
※このプログラムは動作未テストです。
だって、内臓カメラもUSBカメラも持ってないんだもん(泣)

なお、実行時にはopencv_world300.dllが必要です(BASIC.EXEと同じフォルダに入れてください)

下記URLからダウンロードしてください。(imagetool.zip)

https://36.gigafile.nu/1125-n8d2d72a2da1c926a4d213cd6f41f8bd3

ダウンロード期限:2019年11月25日(月)
ダウンロードキー:設定していません

※警告
open cvは日本語パスに対応していません。


!'USBカメラ映像を表示する
OPTION BASE 0
LET XSIZE=640 !'カメラデバイス対応の解像度を指定すること
LET YSIZE=480
LET ID=0 !'カメラデバイスナンバー
DIM M(XSIZE,YSIZE)
CALL GINIT(XSIZE,YSIZE)
DO
   CALL GETCAMERAFRAME(ID,XSIZE,YSIZE,M)
   MAT PLOT CELLS,IN 0,0;XSIZE-1,YSIZE-1:M
   WAIT DELAY .3
LOOP
END

EXTERNAL SUB GETCAMERAFRAME(ID,WIDTH,HEIGHT,M(,))
OPTION CHARACTER BYTE
LET MAP$=REPEAT$(CHR$(0),WIDTH*HEIGHT*3)
LET NUM=GETCAMERAFRAME_(ID,WIDTH,HEIGHT,MAP$)
IF NUM=-1 THEN
   PRINT "カメラデバイスが見つかりません"
   STOP
ELSEIF NUM=-2 THEN
   PRINT "データが読み出せません"
   STOP
END IF
FOR Y=0 TO HEIGHT-1
   FOR X=0 TO WIDTH-1
      LET ADR=(Y*WIDTH+X)*3+1
      LET R=ORD(MAP$(ADR+2:ADR+2))
      LET G=ORD(MAP$(ADR+1:ADR+1))
      LET B=ORD(MAP$(ADR:ADR))
      LET M(X,Y)=COLORINDEX(R/255,G/255,B/255)
   NEXT X
NEXT Y
!'
FUNCTION GETCAMERAFRAME_(ID,WIDTH,HEIGHT,MAP$)
   ASSIGN ".\DLL\getcameraframe.dll","getcameraframe"
END FUNCTION
END SUB

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
SET POINT STYLE 1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB

--------------------------------------------------------------------------
                             getcameraframe.cpp


#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

extern "C"  __declspec(dllexport) int getcameraframe(int n,int width,int height,char *framedata)
{
    Mat img;
    VideoCapture cap(n);
    if (!cap.isOpened()) return -1;
    cap.set(CV_CAP_PROP_FRAME_WIDTH,width); //縦の大きさ
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,height); //横の大きさ
    if (!cap.read(img)) return -2;
    cap>>img ; //1フレーム分取り出してimgに保持させる
    for(int y=0; y<height; y++)
        for(int x=0; x<width; x++)
            for(int c=0; c<3; c++)
                framedata[(y*width+x)*3+c]=img.at<cv::Vec3b>(y,x)[c]; // c=0 blue, c=1 green, c=2 red
    return 0;
}
            
 

Re: カメラ映像表示

 投稿者:twaga  投稿日:2020年 9月 7日(月)23時07分9秒
  > No.4728[元記事へ]

opencv_world300.dll
getcameraframe.dll

を再度アップロードしていただくことはできませんでしょうか。

十進BASICでカメラ映像を表示したいと思っており、検索していたらこちらの掲示板にたどりつきました。

しばっちさんへのお返事です。


>
> なお、実行時にはopencv_world300.dllが必要です(BASIC.EXEと同じフォルダに入れてください)
>
> 下記URLからダウンロードしてください。(imagetool.zip)
>
> https://36.gigafile.nu/1125-n8d2d72a2da1c926a4d213cd6f41f8bd3
>
> ダウンロード期限:2019年11月25日(月)
> ダウンロードキー:設定していません
>


> !'
> FUNCTION GETCAMERAFRAME_(ID,WIDTH,HEIGHT,MAP$)
>    ASSIGN ".\DLL\getcameraframe.dll","getcameraframe"
> END FUNCTION
> END SUB
>
> EXTERNAL SUB GINIT(XSIZE,YSIZE)
> SET BITMAP SIZE XSIZE,YSIZE
> SET COLOR MIX(0) 0,0,0
> SET COLOR MODE "NATIVE"
> CLEAR
> SET POINT STYLE 1
> SET WINDOW 0,XSIZE-1,YSIZE-1,0
> END SUB
>
> --------------------------------------------------------------------------
>                              getcameraframe.cpp
>
>
> #include <opencv2/core/core.hpp>
> #include <opencv2/imgproc/imgproc.hpp>
> #include <opencv2/objdetect/objdetect.hpp>
> #include <opencv2/highgui/highgui.hpp>
>
> using namespace std;
> using namespace cv;
>
> extern "C"  __declspec(dllexport) int getcameraframe(int n,int width,int height,char *framedata)
> {
>     Mat img;
>     VideoCapture cap(n);
>     if (!cap.isOpened()) return -1;
>     cap.set(CV_CAP_PROP_FRAME_WIDTH,width); //縦の大きさ
>     cap.set(CV_CAP_PROP_FRAME_HEIGHT,height); //横の大きさ
>     if (!cap.read(img)) return -2;
>     cap>>img ; //1フレーム分取り出してimgに保持させる
>     for(int y=0; y<height; y++)
>         for(int x=0; x<width; x++)
>             for(int c=0; c<3; c++)
>                 framedata[(y*width+x)*3+c]=img.at<cv::Vec3b>(y,x)[c]; // c=0 blue, c=1 green, c=2 red
>     return 0;
> }
>            
 

戻る