private static boolean ready; private static int number;
Способ работы модели памяти состоит в том, что каждый поток может считывать и записывать свою собственную копию этих переменных (проблема также затрагивает нестатические переменные-члены). Это является следствием того, как может работать базовая архитектура.
Джереми Мэнсон и Брайан Гетц :
В многопроцессорных системах процессоры обычно имеют один или несколько уровней кеша памяти, что повышает производительность как путем ускорения доступа к данным (поскольку данные ближе к процессору), так и уменьшения трафика на шине общей памяти (поскольку многие операции с памятью могут выполняться локальными кэшами.) Кассеты памяти могут значительно улучшить производительность, но они представляют множество новых задач. Что, например, происходит, когда два процессора одновременно проверяют одну и ту же ячейку памяти? В каких условиях они будут видеть одно и то же значение?
blockquote>Итак, в вашем примере два потока могут выполняться на разных процессорах, каждый из которых имеет копию
ready
в своих собственных отдельных кэшах , Язык Java предоставляет механизмыvolatile
иsynchronized
для обеспечения синхронизации значений, наблюдаемых потоками.
простое бочкообразное \ подушечное искажение в opencv c ++
IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky)
{
IplImage* mapx = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
IplImage* mapy = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
int w= img->width;
int h= img->height;
float* pbuf = (float*)mapx->imageData;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
float u= Cx+(x-Cx)*(1+kx*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
*pbuf = u;
++pbuf;
}
}
pbuf = (float*)mapy->imageData;
for (int y = 0;y < h; y++)
{
for (int x = 0; x < w; x++)
{
*pbuf = Cy+(y-Cy)*(1+ky*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
++pbuf;
}
}
/*float* pbuf = (float*)mapx->imageData;
for (int y = 0; y < h; y++)
{
int ty= y-Cy;
for (int x = 0; x < w; x++)
{
int tx= x-Cx;
int rt= tx*tx+ty*ty;
*pbuf = (float)(tx*(1+kx*rt)+Cx);
++pbuf;
}
}
pbuf = (float*)mapy->imageData;
for (int y = 0;y < h; y++)
{
int ty= y-Cy;
for (int x = 0; x < w; x++)
{
int tx= x-Cx;
int rt= tx*tx+ty*ty;
*pbuf = (float)(ty*(1+ky*rt)+Cy);
++pbuf;
}
}*/
IplImage* temp = cvCloneImage(img);
cvRemap( temp, img, mapx, mapy );
cvReleaseImage(&temp);
cvReleaseImage(&mapx);
cvReleaseImage(&mapy);
return img;
}
более сложная форма http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
Аппроксимация модели полиномиального радиального искажения, которую вы можете найти в Fitzgibbon, 2001
, равна
, где rd и ru - расстояния от центра искажения. Это также используется для фильтрации искажений изображения широкоугольной камеры для целей компьютерного зрения и обработки изображений.
Более подробное объяснение принципа и кода шейдера для реализации фильтрации искажения (а также прямого преобразования) можно найти здесь: http://marcodiiga.github.io/radial-lens-undistortion- filtering
Я также публикую статьи, на которые стоит обратить внимание, если вы хотите узнать математические подробности метода, который я опубликовал
Согласно Википедии, также может быть термин к степени 4. Знаки двух констант (для терминов от r до 2 и от r до 4) могут быть противоположными, что приводит к искажению руля, когда центр изображения имеет бочкообразное искажение, а край имеет искажение подушкообразной булавкой, создавая прямые линии в виде усов на руле .