在opencv中创建任意大小的数组/图像?

时间:2013-07-11 09:17:03

标签: matlab opencv image-processing matrix porting

下面是我在MATLAB中实现的一行,它表明矩阵的行和列是灵活的。我可以添加任意数量的具有维度3的对象。我需要在OpenCV中执行相同的操作。

ColorValues(:,:,3)=0;

以下是我要转换为OpenCV的代码:

ColorValues(:,:,3)=0;
for i=1:M
    for j=1:N
        if (bw(i,j)==0)
            ColorValues(i,j,:)=image(i,j,:);
        else
            ColorValues(i,j,:)=0;
        end
    end
end

2 个答案:

答案 0 :(得分:0)

我不认为你想在这里实现的是opencv。看看matrix constructor。您不需要分配内存 - 或者在您不需要时立即释放它;如果您使用默认构造函数:

Mat A;

这将创建一个“灵活”的矩阵。如果要定义类型(作为3个通道);那么你也需要定义大小。没有用于此目的的构造函数。

一种解决方案是创建非灵活数据:

Mat B(1,3,CV_8UC1);

然后使用此矩阵中的颜色数据。

作为另一种方法,您可能需要查看C ++的标准库; listvector结构可能会对您有所帮助。

vector<vector<int> > imageCoordinates;
vector<int> RGB(3);

将创建灵活的图像平面;并在单独的数据中固定3通道。

答案 1 :(得分:0)

以下是OpenCV中的一个示例。我们使用与输入图像大小相同的掩码,使用Mat::setTo方法将图像中的值“归零”。

#include "opencv2/highgui/highgui.hpp"

int main()
{
    // read an RGB image
    cv::Mat img = cv::imread("lena.png", cv::IMREAD_COLOR);
    if (!img.data) {
        return -1;
    }

    // create a circular mask
    cv::Mat mask = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
    cv::circle(mask, cv::Point(img.rows/2,img.cols/2), 150, cv::Scalar(255), CV_FILLED);

    // mask out the "on" values by setting them to zero
    img.setTo(cv::Scalar::all(0), mask);

    // show result
    cv::namedWindow("demo", cv::WINDOW_AUTOSIZE);
    cv::imshow("demo", img);
    cv::waitKey(0);

    return 0;
}

pic