#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, как они работают и насколько они эффективны.