下面是我在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
答案 0 :(得分:0)
我不认为你想在这里实现的是opencv。看看matrix constructor。您不需要分配内存 - 或者在您不需要时立即释放它;如果您使用默认构造函数:
Mat A;
这将创建一个“灵活”的矩阵。如果要定义类型(作为3个通道);那么你也需要定义大小。没有用于此目的的构造函数。
一种解决方案是创建非灵活数据:
Mat B(1,3,CV_8UC1);
然后使用此矩阵中的颜色数据。
作为另一种方法,您可能需要查看C ++的标准库; list
和vector
结构可能会对您有所帮助。
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;
}