opencv - 如何从几个小图片中创建一个大图像?

时间:2013-01-12 14:23:24

标签: opencv

我是opencv的新手。 我的问题如下: 我有一个很大的形象。我想以这样的方式拍摄它的4个角,以便从每个角​​落拍摄5X5像素的区域。然后我想基于4个角创建一个大图像。

新图片尺寸为10X10。

解决这个问题的最佳方式是什么?

由于

2 个答案:

答案 0 :(得分:4)

使用C ++ - Interface,您可以这样做:

#include <opencv2/opencv.hpp>
cv::Mat CornersOnly(const cv::Mat& src, int cw, int ch)
{
    using namespace cv;
    int w(src.cols);
    int h(src.rows);
    CV_Assert(w >= cw);
    CV_Assert(h >= ch);
    Mat dst(2*ch, 2*cw, src.type());
    Mat(src, Rect(0,    0,    cw, ch)).copyTo(Mat(dst, Rect( 0,  0, cw, ch)));
    Mat(src, Rect(w-cw, 0,    cw, ch)).copyTo(Mat(dst, Rect(cw,  0, cw, ch)));
    Mat(src, Rect(0,    h-ch, cw, ch)).copyTo(Mat(dst, Rect( 0, ch, cw, ch)));
    Mat(src, Rect(w-cw, h-ch, cw, ch)).copyTo(Mat(dst, Rect(cw, ch, cw, ch)));
    return dst;
}
int main()
{
    cv::imwrite("Lenna_Corners.png", CornersOnly(cv::imread("Lenna.png"), 100, 100));
}

输入:

enter image description here

输出:

enter image description here

为了获得更好的可见性,我在本例中使用了100而不是5个像素。

答案 1 :(得分:1)

这是一个通过在OpenCV C界面中组合图像的4个角来创建图像的简单功能。我不知道这是不是最好的方式,但它确实有效:

IplImage* getCorners(IplImage* img, int regionWidth, int regionHeight)
{
    IplImage* result = cvCreateImage(cvSize(regionWidth * 2,regionHeight * 2),img->depth,img->nChannels);

    //Copy Top Left Region
    cvSetImageROI(img,cvRect(0,0,regionWidth,regionHeight));
    cvSetImageROI(result,cvRect(0,0,regionWidth,regionHeight));
    cvCopy(img,result);

    //Copy Top Right Region
    cvSetImageROI(img,cvRect(img->width - regionWidth - 1,0,regionWidth,regionHeight));
    cvSetImageROI(result,cvRect(regionWidth,0,regionWidth,regionHeight));
    cvCopy(img,result);

    //Copy Bottom Left Region
    cvSetImageROI(img,cvRect(0,img->height - regionHeight - 1,regionWidth,regionHeight));
    cvSetImageROI(result,cvRect(0,regionHeight,regionWidth,regionHeight));
    cvCopy(img,result);

    //Copy Bottom Right Region
    cvSetImageROI(img,cvRect(img->width - regionWidth - 1,img->height - regionHeight - 1,regionWidth,regionHeight));
    cvSetImageROI(result,cvRect(regionWidth,regionHeight,regionWidth,regionHeight));
    cvCopy(img,result);

    //Reset Image Region Of Interest
    cvResetImageROI(img);
    cvResetImageROI(result);

    return result;
}

我希望它有所帮助。 :)