0

マスクを作成するためのコードとスクリーンショットがありますが、マスクのサイズが元のフレーム全体をカバーしていないのは奇妙に思えます。ここにヒントはありますか?

    *cap >> frame1;
    Rect roi(100,100,100,100);
    for(int i =0; i<frame1.rows; i++)
    {
        for(int j=0; j<frame1.cols;j++)
        {
            if(!roi.contains(Point(i,j)))
            {
                frame1.at<uchar>(i,j) = 0;
            }
        }
    }

ここに画像の説明を入力

4

1 に答える 1

0

私の仮定は、それframe1はカラー画像であり、 type を持っているということですCV_8UC3。次のコード スニペットのframe1ように作成して入力してみてください。frame_gray

cv::Mat3b frame_color;
*cap >> frame_color;
cv::Mat1b frame_gray;
cv::cvtColor(frame_color, frame_gray, CV_BGR2GRAY)

または、タイプを変更したくない場合はframe1、次のコードを使用します。

*cap >> frame1;
Rect roi(100,100,100,100);
for(int i =0; i<frame1.rows; i++)
{
    for(int j=0; j<frame1.cols;j++)
    {
        if(!roi.contains(Point(i,j)))
        {
            frame1.at<cv::Vec3b>(i,j) = cv::Vec3b::all(0);
        }
    }
}

またはどちらがはるかに短いか(テストされていませんが、アイデアは明確なはずです):

*cap >> frame1;
Rect roi(100,100,100,100);
cv::Mat3b color_mask = cv::Mat3b::ones(frame1.size());
color_mask(roi) = cv::Mat3b::zeros(roi.size());
frame1 = frame1.mul(color_mask);
于 2013-04-11T15:48:25.257 に答える