我想做什么:
以OpenCV :: Mat格式转换Nao Robot相机图像的ROI。稍后我会使用这个OpenCV :: Mat
情况:
Nao SDK以称为ALImage的格式提供图像。可以convert the ALImage to OpenCV::Mat format,但我不需要所有图像,只需要很小的投资回报率。尽管ALImage提供了自己的ROI,但使用它的方法并没有多大帮助:
int getNumOfROIs () const
const ROI* getROI (int index) const
void addROI (const ROI &rect)
void cleanROIs ()
void setEnableROIs (bool enable)
bool isROIEnabled () const
问题:
我如何使用这些投资回报率?
答案 0 :(得分:0)
假设您已经拥有投资回报率的坐标,则可以裁剪cv::Mat
this:
// your source image
cv::Mat image(imagesource);
// a rectangle with your ROI coordinates
cv::Rect myROI(10, 10, 100, 100);
// a "reference" to the image data within the rectangle
cv::Mat croppedImage = image(myROI);
请注意,这会不复制图像数据。 image
和croppedImage
都共享相同的基础原始数据(详细示例可在opencv documentation中找到)。完成大型源图像后,您可以image.release()
和croppedImage = croppedImage.clone();
取消分配所有不必要的数据(在投资回报率之外)。
修改强>
我还没有使用AL::ALImage::ROI
,但the definition in alimage/alimage.h看起来很熟悉cv::Rect
。所以你可以做以下事情:
// let's pretend you already got your image ...
AL::ALImage yourImage;
// ... and a ROI ...
AL::ALImage::ROI yourROI;
// ... as well as a Mat header with the dimensions and type of yourImage
cv::Mat header;
// then you can convert the ROI, ...
cv::Rect cvROI(yourROI.x, yourROI.y, yourROI.w, yourROI.h);
// ... wrap ALImage to a Mat (which should not copy anything) ...
header.data = yourImage.getData();
// ... and then proceed with the steps mentioned above to crop your Mat
cv::Mat cropped = header(cvROI);
header.release();
cropped = cropped.clone();
// ...
// your image processing using cropped
// ...
我希望这会有所帮助。