web-dev-qa-db-ja.com

OpenCVでCvMatをトリミングする方法は?

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

49
Waqar

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);

サブ画像を抽出するためのドキュメント

111
Chris

この質問はすでに解決されていることはわかっていますが、非常に簡単に切り取る方法があります。あなたは1行でそれを行うことができます-

Mat cropedImage = fullImage(Rect(X,Y,Width,Height));
35
MMH

さまざまなタイプのマトリックスに対してより良い結果と堅牢性を得るには、データをコピーする最初の答えに加えてこれを行うことができます:

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);
17
pacongfar

必要な作物のコピーを作成するには、次のようにします。

// Read img
cv::Mat img = cv::imread("imgFileName");
cv::Mat croppedImg;

// This line picks out the rectangle from the image
// and copies to a new Mat
img(cv::Rect(xMin,yMin,xMax-xMin,yMax-yMin)).copyTo(croppedImg);

// Display diff
cv::imshow( "Original Image",  img );
cv::imshow( "Cropped Image",  croppedImg);
cv::waitKey();
3
Reed Richards

この質問には答えられたと思いますが、おそらくこれは誰かに役立つかもしれません...

データを別のcv :: Matオブジェクトにコピーする場合は、次のような関数を使用できます。

void ExtractROI(Mat& inImage, Mat& outImage, Rect roi){
    /* Create the image */
    outImage = Mat(roi.height, roi.width, inImage.type(), Scalar(0));

    /* Populate the image */
    for (int i = roi.y; i < (roi.y+roi.height); i++){
        uchar* inP = inImage.ptr<uchar>(i);
        uchar* outP = outImage.ptr<uchar>(i-roi.y);
        for (int j = roi.x; j < (roi.x+roi.width); j++){
            outP[j-roi.x] = inP[j];
        }
    }
}

これは、単一チャネルイメージでのみ適切に機能することに注意することが重要です。

0
strudelheist