Как мне применить cv ::Rect к указателю на изображение?

#c #opencv

#c #opencv

Вопрос:

Я пытаюсь отобразить половину изображения (от указателя на изображение):

 #include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

void main() {

    // Load image
    std::string path = "Resources/test.png";
    cv::Mat img = cv::imread(path);
    
    // Pointer to image
    cv::Mat* img_p = new cv::Mat(img.size(), CV_8UC1);
    *img_p = img;

    // Find size of rows and columns
    int nRows = img_p->rows;
    int nCols = img_p->cols;

    // Display left half of image
    cv::imshow("left image", *img_p(cv::Rect(0, 0, nCols / 2, nRows)));
    
    cv::waitKey(5000);
    delete img_p;
}
 

Я получаю сообщение об ошибке в этой строке:

 cv::imshow("left image", *img_p(cv::Rect(0, 0, nCols / 2, nRows)));
 

Ошибка:

 expression preceding parantheses of apparent call must have (pointer-to-) function type
 

Как мне получить доступ к половине изображения из указателя?
Редактировать
Я хочу получить доступ к половине изображения из указателя для повышения производительности.

Комментарии:

1. вероятно (*img_p)(cv::Rect(0, 0, nCols / 2, nRows)) , должно сработать, но, пожалуйста, пожалуйста, пожалуйста, не используйте указатели cv::Mat, если у вас нет действительно веской причины. объект cv::Mat не копирует данные вглубь и фактически похож на интеллектуальный указатель на фактические пиксельные данные. Я сомневаюсь, что вы получите какое-либо заметное ускорение, и, вероятно, ваши дополнительные затраты на увеличение времени разработки и исправление труднодоступных ошибок и проблем не будут стоить того.

Ответ №1:

Вам не нужно использовать new / delete или указатели для того, что вы пытаетесь сделать.

 void main() {

    // Load image
    std::string path = "Resources/test.png";
    cv::Mat img = cv::imread(path);
    
    cv::Mat subImg = img(cv::Rect(0, 0, img.cols / 2, img.rows));

    // Display left half of image
    cv::imshow("left image", subImg);
    
    cv::waitKey(5000);
}
 

Все cv::Mat копии используют одни и те же данные / буфер, если вы явно не используете cv::Mat::clone() .

Комментарии:

1. Конечно, но указатели более эффективны. Как бы вы получили доступ к подматрице изображения из указателя на изображение?

2. Если вы не создаете миллионы копий cv::Mat обработчиков в секунду в своей программе, нет, указатели не будут более эффективными. Видя подобные вещи new cv::Mat(...)) , кажется, у вас неправильные представления о том, что делают обработчики OpenCV, как они работают и насколько они эффективны.