67

CvMatMatrix sayで変換された画像がありますCVMat source。から関心領域を取得したらsource、アルゴリズムの残りの部分をその関心領域にのみ適用したいと考えています。sourceそのためには、どうにかして私ができないマトリックスをトリミングする必要があると思います。CvMatマトリックスをトリミングして別のトリミングされたマトリックスを返すメソッドまたは関数はありCvMatますか? ありがとう。

4

6 に答える 6

146

OpenCV には、便利な関心領域関数があります。を使用している場合はcv::Mat、次のようなものを使用できます。

// You mention that you start with a CVMat* imagesource
CVMat * imagesource;

// Transform it into the C++ cv::Mat format
cv::Mat image(imagesource); 

// Setup a rectangle to define your region of interest
cv::Rect myROI(10, 10, 100, 100);

// Crop the full image to that image contained by the rectangle myROI
// Note that this doesn't copy the data
cv::Mat croppedImage = image(myROI);

サブイメージの抽出に関するドキュメント

于 2011-11-25T10:55:39.633 に答える
23

さまざまな種類の行列に対してより良い結果と堅牢性を得るには、データをコピーする最初の回答に加えてこれを行うことができます。

cv::Mat source = getYourSource();

// Setup a rectangle to define your region of interest
cv::Rect myROI(10, 10, 100, 100);

// Crop the full image to that image contained by the rectangle myROI
// Note that this doesn't copy the data
cv::Mat croppedRef(source, myROI);

cv::Mat cropped;
// Copy the data into new matrix
croppedRef.copyTo(cropped);
于 2014-04-03T08:31:07.693 に答える
-2

opencv 関数を使用して Mat を簡単に切り取ることができます。

setMouseCallback("Original",mouse_call);

を以下mouse_callに示します。

 void mouse_call(int event,int x,int y,int,void*)
    {
        if(event==EVENT_LBUTTONDOWN)
        {
            leftDown=true;
            cor1.x=x;
            cor1.y=y;
           cout <<"Corner 1: "<<cor1<<endl;

        }
        if(event==EVENT_LBUTTONUP)
        {
            if(abs(x-cor1.x)>20&&abs(y-cor1.y)>20) //checking whether the region is too small
            {
                leftup=true;
                cor2.x=x;
                cor2.y=y;
                cout<<"Corner 2: "<<cor2<<endl;
            }
            else
            {
                cout<<"Select a region more than 20 pixels"<<endl;
            }
        }

        if(leftDown==true&&leftup==false) //when the left button is down
        {
            Point pt;
            pt.x=x;
            pt.y=y;
            Mat temp_img=img.clone();
            rectangle(temp_img,cor1,pt,Scalar(0,0,255)); //drawing a rectangle continuously
            imshow("Original",temp_img);

        }
        if(leftDown==true&&leftup==true) //when the selection is done
        {

            box.width=abs(cor1.x-cor2.x);
            box.height=abs(cor1.y-cor2.y);
            box.x=min(cor1.x,cor2.x);
            box.y=min(cor1.y,cor2.y);
            Mat crop(img,box);   //Selecting a ROI(region of interest) from the original pic
            namedWindow("Cropped Image");
            imshow("Cropped Image",crop); //showing the cropped image
            leftDown=false;
            leftup=false;

        }
    }

詳細については、マウスを使用して画像をトリミングするリンクを参照してください。

于 2016-06-25T07:57:41.350 に答える