Здравствуйте, я продумал доступ к моим пикселям в opencv 2 каким-то умным способом. Для этого я определил следующую структуру пикселя:Opencv Определение типа данных
struct mypixels
{
unsigned char red;
unsigned char green;
unsigned char blue;
};
теперь я судимое следующее, и она работает:
int sz[3] = {2,2};
cv::Mat XL(2,sz, CV_8UC3, cv::Scalar::all(0));
cv::Mat_<cv::Vec3b> pixiter = XL;
pixiter.at<mypixels>(0,0).green = 22;
Сейчас этот код хорошо работает в режиме выпуска, но в режиме отладки, я получаю какое-то нарушение доступа ошибка. Я не пытался взломать или переписать классы opencv. Я просто не понимаю, что я должен сделать, чтобы этот код работал в режиме выпуска и отладки. Я подумал, что, может быть, я должен определить свои пиксели так, как это написано здесь: http://docs.opencv.org/trunk/modules/core/doc/basic_structures.html#datatype Но я не мог понять, как и что мне здесь делать. Может быть, это тот, кто знает больше.
--EDIT--
С рабочим раствором user2151446 и некоторой дополнительной мощностью мозга я пришел к этому решению:
template<> class cv::DataType<mypixels>
{
public:
typedef mypixels value_type;
typedef int work_type;
typedef unsigned char channel_type;
typedef value_type vec_type;
enum { depth = CV_8U, channels = 3,
type = CV_MAKETYPE(depth, channels), fmt=(int)'u' };
};
int sz [3] = {2,2}; 3-разрядный массив инициализируется всего двумя значениями. Это то, что вы действительно хотите? – PermanentGuest
это ошибка, которую я потратил только на два измерения, но я думаю, что это не должно вызывать никаких различий в коде – jamk
Действительно?Это заставит cv_Mat выделить память для дополнительного измерения неопределенного размера. – PermanentGuest