我的图像转换为CvMat
矩阵CVMat source
。一旦我从source
获得感兴趣的区域,我希望算法的其余部分仅应用于该感兴趣的区域。为此我想我将不得不以某种方式裁剪source
矩阵,我无法这样做。是否有方法或函数可以裁剪CvMat
矩阵并返回另一个裁剪的CvMat
矩阵?感谢。
答案 0 :(得分:103)
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);
答案 1 :(得分:35)
我知道这个问题已经解决了......但是有一种非常简单的方法可以裁剪。你可以在一行中完成 -
Mat cropedImage = fullImage(Rect(X,Y,Width,Height));
答案 2 :(得分:17)
为了获得针对不同类型矩阵的更好结果和稳健性,除了复制数据的第一个答案外,您还可以执行此操作:
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);
答案 3 :(得分:3)
要创建我们想要的裁剪副本,我们可以执行以下操作,
// 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();
答案 4 :(得分:1)
我理解这个问题已得到解答,但也许这对某些人可能有用......
如果您希望将数据复制到单独的 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];
}
}
}
重要的是要注意,这只能在单通道图像上正常运行。
答案 5 :(得分:-2)
您可以使用opencv功能轻松裁剪Mat。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(TalentInfo model, IEnumerable<HttpPostedFileBase> files)
{
if (ModelState.IsValid)
{
//you have lots of code here....
}
else
{
//you need to return something here....because (ModelState.IsValid) might be false
}
}
setMouseCallback("Original",mouse_call);
如下:
mouse_call
有关详细信息,请访问链接Cropping the Image using Mouse