NSOperationQueue и параллельный по сравнению с непараллельным

Редактировать: Чтобы убить избирателя: Пожалуйста, прокомментируйте причину, по которой вы проголосовали за проверенный и проверенный код.

#include "cv.h"
#include "highgui.h"
#include "math.h"
int main( int argc, char** argv )
{
    IplImage* src = cvLoadImage("lena.jpg", 1);    
    IplImage* dst = cvCloneImage( src );

    int delta = 1;
    int angle = 0;
    int opt = 1;   // 1: rotate & zoom
               // 0:  rotate only
    double factor;
    cvNamedWindow("src", 1);
    cvShowImage("src", src);

    for(;;)
    {
    float m[6];
    CvMat M = cvMat(2, 3, CV_32F, m);
    int w = src->width;
    int h = src->height;

    if(opt)  
        factor = (cos(angle*CV_PI/180.) + 1.05) * 2;
    else 
        factor = 1;
    m[0] = (float)(factor*cos(-angle*2*CV_PI/180.));
    m[1] = (float)(factor*sin(-angle*2*CV_PI/180.));
    m[3] = -m[1];
    m[4] = m[0];
    m[2] = w*0.5f;  
    m[5] = h*0.5f;  

    cvGetQuadrangleSubPix( src, dst, &M);
    cvNamedWindow("dst", 1);
    cvShowImage("dst", dst);
    if( cvWaitKey(1) == 27 )
        break;
    angle =(int)(angle + delta) % 360;
    }     
    return 0;
}

ОБНОВЛЕНИЕ : см. Следующий код для ротация с использованием warpaffine https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/affine2_cpp.cpp?r=48

#include 
#include 

using namespace cv;

int
main(int argc, char **argv)
{
  // (1)load a specified file as a 3-channel color image,
  //    set its ROI, and allocate a destination image
  const string imagename = argc > 1 ? argv[1] : "../image/building.png";
  Mat src_img = imread(imagename);
  if(!src_img.data)
    return -1;
  Mat dst_img = src_img.clone();

  // (2)set ROI
  Rect roi_rect(cvRound(src_img.cols*0.25), cvRound(src_img.rows*0.25), cvRound(src_img.cols*0.5), cvRound(src_img.rows*0.5));
  Mat src_roi(src_img, roi_rect);
  Mat dst_roi(dst_img, roi_rect);

  // (2)With specified three parameters (angle, rotation center, scale)
  //    calculate an affine transformation matrix by cv2DRotationMatrix
  double angle = -45.0, scale = 1.0;
  Point2d center(src_roi.cols*0.5, src_roi.rows*0.5);
  const Mat affine_matrix = getRotationMatrix2D( center, angle, scale );

  // (3)rotate the image by warpAffine taking the affine matrix
  warpAffine(src_roi, dst_roi, affine_matrix, dst_roi.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar::all(255));

  // (4)show source and destination images with a rectangle indicating ROI
  rectangle(src_img, roi_rect.tl(), roi_rect.br(), Scalar(255,0,255), 2);

  namedWindow("src", CV_WINDOW_AUTOSIZE);
  namedWindow("dst", CV_WINDOW_AUTOSIZE);
  imshow("src", src_img);
  imshow("dst", dst_img);
  waitKey(0);

  return 0;
}

16
задан Alexi Groove 29 October 2009 в 23:19
поделиться

2 ответа

NSOperationQueue всегда выполняет операции одновременно, учитывая при этом зависимости.

«Непараллельная» операция требует отдельного потока для одновременного выполнения. NSOperationQueue отвечает за предоставление этого потока. Другими словами, непараллельная операция зависит от NSOperationQueue , чтобы сделать ее параллельной операцией.

«Параллельная» операция является параллельной сама по себе; ему не требуется NSOperationQueue , чтобы создать для него поток. Примером может служить операция, использующая асинхронный файловый ввод-вывод.

Если вы хотите, чтобы две или более операций выполнялись последовательно, вам необходимо использовать зависимости.

Если вы хотите, чтобы операция блокировала основной поток, не используйте NSOperationQueue ; просто запускайте каждую операцию одну за другой в основном потоке.

Чтобы вручную установить максимальное количество одновременных операций, используйте метод для operationQueue setMaxConcurrentOperationCount:

25
ответ дан 30 November 2019 в 21:28
поделиться

Вам действительно нужно создать подкласс NSOperation ? Почему бы просто не использовать NSInvocationOperation и его метод addDependency: ?

См. Мой ответ в на этот вопрос SO .

1
ответ дан 30 November 2019 в 21:28
поделиться