2

C++を使用OpenCV 2.4.4してオブジェクト検出を行っています。残念ながら、私が検出しなければならないオブジェクトには固有の形状はありませんが、HSV カラー スペースには特定の色範囲があります (現在、いくつかの赤いオブジェクトを検出しています)。

また、オブジェクトは画像の一部にのみ存在する必要があるため、すべての画像をスキャンしているわけではありません。さらに、この ROI の下にサブ ROI (小さな四角形) があり、これらの四角形のどれにオブジェクトはフレーム内にあります)。

そのため、最初に大きな ROI で何かが検出されたことを検出しようとしました。検出された場合は、環境に異質な色を設定しました。次のコードでそれを行いました:

cvtColor(frame(Range(0,espv),Range::all()),framhsv,CV_BGR2HSV); 
MatIterator_<Vec3b> it, ith, end, endh;
ith  = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it   = (frame(Range(0,espv),Range::all())).begin<Vec3b>(); 
for (;ith != endh; ++it,++ith){
    if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
        (*it)[0] = 63;
        (*it)[1] = 0;
        (*it)[2] = 255;}}

すべてが正しく機能し、オブジェクトが「検出」されたので、オブジェクトが各サブ ROI にあるかどうかを検出する次のステップに進みました。そのために、各サブ ROI で「検出された」ピクセルの数を返す次の関数を作成したので、どれが正しいサブ ROI であるかを検討できます。

関数は次のとおりです。

Vector<int> CountRed(cv::Mat &frame, int hspa, int vspa, int nlines ,int nblocks){
    Vector<int> count(nblocks*nlines,0);
    for(int i = 1; i<= nlines; i++){
        for(int j = 1; j<= nblocks; j++){

            Mat framhsv;
            cvtColor(frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa)),framhsv,CV_BGR2HSV); //Converte somente a área de interesse para HSV

            MatIterator_<Vec3b> it, ith, endh;
            ith  = framhsv.begin<Vec3b>();
            endh = framhsv.end<Vec3b>();
            it   = (frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa))).begin<Vec3b>();

            for (;ith != endh; ++it,++ith){
                if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
                    (*it)[0] = 63;
                    (*it)[1] = 0;
                    (*it)[2] = 255;
                    count[(j)+nblocks*(i-1)-1]++;}}}}
return count;
}

コードは警告やエラーなしでコンパイルされ、ビデオが表示されますが、ROI の任意の部分で検出する必要があるオブジェクトを挿入すると、コードが機能しなくなります。これは、次のものを削除した場合にも発生します。

count[(j)+nblocks*(i-1)-1]++;

ライン。次のエラーが表示されます。 Access violation writing location 0xFFFFF970.

問題は、使用していないときにイテレータにアクセスすることにあるに違いないと本当に思いますRange::All()

ここで何をしているのかを明確にするために、フレームの画像を示します: http://i.imgur.com/Irvr8bk.jpg

紫色の領域はフレーム、赤色の領域は ROI、黒い領域はそれぞれサブ ROI です。

を使用して ROI を定義しようframe(Rect(0,0,frame.cols,2*vspa)としても機能しましたが、 を使用してサブ ROI を操作しようとすると同じエラーが発生しましたcv::RectMatIterator_したがって、完全な行構造にアクセスしていない場合、これはエラーであるに違いないと本当に思います。

では、これらのサブ ROI を操作するにはどうすればよいでしょうか?

4

0 に答える 0