fac(0,1).
fac(N,X) :- N1 is N -1, fac(N1, T), X is N * T.
fac(0,N,N).
fac(X,N,T) :- A is N * X, X1 is X - 1, fac(X1,A,T).
fac(N,T) :- fac(N,1,T).
Здесь есть диаграмма здесь , в которой резюмируются различные различные лицензии FOSS, а в первом столбце комментарии по связыванию проприетарного программного обеспечения. Он не выглядит особенно актуальным и не включает лицензионную версию, но с него все же можно начать.
s важно , чтобы вы выполняли арифметические операции с указателем в байтах (или uchar
, т.е. unsigned char
), поскольку OpenCV имеет тенденцию заполнять строки изображений с дополнительными байтами для повышения эффективности (особенно для двойных
изображений).
Таким образом, даже если элемент double
составляет 8 байтов, а у вас, скажем, 300 строк, не гарантируется, что строка закончится на 8 * 300 или 2400 байтах, поскольку OpenCV может заполнить конец.
Таким образом, это не позволяет вам инициализировать указатель на первый элемент изображения и затем использовать ptr [y * img-> height + x]
для доступа к элементам, поскольку каждая строка может иметь более ] 8 * (y * img-> height)
байт.
Вот , почему в примере кода каждый раз вычисляется указатель на каждую строку, используя img-> widthStep
, который представляет истинный размер каждой строки в байтах.
OpenCV 2.0
Если вы используете класс Mat
, вы можете сделать то же самое в следующих строках:
cv::Mat img(300,300,CV_64FC1);
for( int y=0; y<img.rows; y++ )
{
double* ptr = reinterpret_cast<double*>(img.data + y * img.step);
for( int x=0; x<img.cols; x++ )
{
ptr[x] = double(255);
}
}
cv::namedWindow("SO");
cv::imshow("SO",img);
cv::waitKey();
где img.step - это расстояние между последовательными строками в байтах
И если вы хотите получить прямой доступ к элементу (медленнее):
img.at