好消息,自从这个拉取请求:正确处理大矩阵 #11505 之后,你应该可以像下面这样做(代码取自测试):
Mat m(65000, 40000, CV_8U);
ASSERT_FALSE(m.isContinuous());
uint64 i, n = (uint64)m.rows*m.cols;
for( i = 0; i < n; i++ )
m.data[i] = (uchar)(i & 255);
cv::threshold(m, m, 127, 255, cv::THRESH_BINARY);
int nz = cv::countNonZero(m); // FIXIT 'int' is not enough here (overflow is possible with other inputs)
ASSERT_EQ((uint64)nz, n / 2);
由于
countNonZero()
返回一个
int
,因此可能会发生溢出。这意味着您应该能够创建巨大的矩阵,但并非所有 OpenCV 函数都能正确处理巨大的矩阵。
关于您的问题,以下是
v5.0a02
中
ITKImageToCVMat
的代码:
template<typename TInputImageType>
cv::Mat
OpenCVImageBridge::ITKImageToCVMat(const TInputImageType* in, bool force3Channels)
{
IplImage* temp = ITKImageToIplImage<TInputImageType>(in, force3Channels);
cv::Mat out = cv::cvarrToMat( temp, true );
cvReleaseImage(&temp);
return out;
}
正如您所看到的,IplImage
图像仍在使用中,可能是您出错的源头。目前最好的选择应该是自己进行转换。也许可以尝试以下代码(我不熟悉ITK,输入和输出类型相同,通道数为1):
typename ImageType::RegionType region = in->GetLargestPossibleRegion();
typename ImageType::SizeType size = region.GetSize();
unsigned int w = static_cast< unsigned int >( size[0] );
unsigned int h = static_cast< unsigned int >( size[1] );
Mat m(h, w, CV_8UC1, in->GetBufferPointer());
这里没有涉及复制操作。如果您想要复制,可以执行以下操作:
Mat m_copy = m.clone();
ulimit -a
命令来查看你是否有内存分配的限制。 - Mark Setchell