2014-01-06 3 views
1

У меня проблема с окончательным изображением, оно искажено, и я не знаю почему. Только когда я включаю параметр openmp в Visual Studio. Если его работа для одного потока не проблема, и края четкие. Код указан ниже.Обнаружение края всплывающего окна Openmp C++

#include "stdafx.h" 
#include<iostream> 
#include<omp.h> 
#include<cmath> 
#include<opencv2/imgproc/imgproc.hpp> 
#include<opencv2/highgui/highgui.hpp> 
using namespace std; 
using namespace cv; 

int xGradient(Mat image, int x, int y) 
{ 
return image.at<uchar>(y-1, x-1) + 
      2*image.at<uchar>(y, x-1) + 
      image.at<uchar>(y+1, x-1) - 
       image.at<uchar>(y-1, x+1) - 
       2*image.at<uchar>(y, x+1) - 
       image.at<uchar>(y+1, x+1); 
} 
int yGradient(Mat image, int x, int y) 
{ 
    return image.at<uchar>(y-1, x-1) + 
      2*image.at<uchar>(y-1, x) + 
      image.at<uchar>(y-1, x+1) - 
       image.at<uchar>(y+1, x-1) - 
       2*image.at<uchar>(y+1, x) - 
       image.at<uchar>(y+1, x+1); 
} 
int main() 

{ 

    Mat src, grey, dst; 
double start, end; 
    start = omp_get_wtime(); 
    int gx, gy, sum; 
src= imread("E:/image.jpg"); 
cvtColor(src,grey,CV_BGR2GRAY); 
    dst = grey.clone(); 
    if(!grey.data) 
    { return -1; } 
#pragma omp parallel for 
    for(int y = 0; y < grey.rows; y++) 
     for(int x = 0; x < grey.cols; x++) 
      dst.at<uchar>(y,x) = 0; 
#pragma omp parallel for 
    for(int y = 1; y < grey.rows - 1; y++){ 
     for(int x = 1; x < grey.cols - 1; x++){ 
      gx = xGradient(grey, x, y); 
      gy = yGradient(grey, x, y); 
      sum = abs(gx) + abs(gy); 
      sum = sum > 255 ? 255:sum; 
      sum = sum < 0 ? 0 : sum; 
      dst.at<uchar>(y,x) = sum; 

       } 
    } 
    namedWindow("sobel"); 
    imshow("sobel", dst); 
    namedWindow("grayscale"); 
    imshow("grayscale", grey); 
    namedWindow("Original"); 
    imshow("Original", src); 
    end = omp_get_wtime(); 
    cout<<"time is: "<<(end-start)<< " seconds" <<endl; 
waitKey(); 
    return 0; 
} 

Спасибо за любую помощь и ответы

+0

#pragma OMP параллельно для распада (2)? просто предположение, что вы хотите, чтобы оба были параллельно, я ошибаюсь, если не ~~~ – barfatchen

+0

Вы запрограммировали гонку данных. Конечно, это предположение, но исключить возможность того, что вы должны явно объявить доступность всех переменных в каждом параллельном регионе: 'private',' shared', what-have-you. –

+0

Существует условие гонки в 'gx',' gy' и 'sum'. Все они разделены и должны быть закрытыми. Просто определите их, когда вы используете их внутри параллельного цикла, и он должен исправить вашу проблему. –

ответ

0

Существует состояние гонки в gx, gy и sum. Все они разделены и должны быть закрытыми. Просто определите их, когда вы используете их внутри параллельного цикла, и он должен исправить вашу проблему. Как это

#pragma omp parallel for 
    for(int y = 1; y < grey.rows - 1; y++){ 
     for(int x = 1; x < grey.cols - 1; x++){ 
      int gx = xGradient(grey, x, y); 
      int gy = yGradient(grey, x, y); 
      int sum = abs(gx) + abs(gy); 
      sum = sum > 255 ? 255:sum; 
      sum = sum < 0 ? 0 : sum; 
      dst.at<uchar>(y,x) = sum; 
+0

Прекрасно работает, окончательное изображение теперь ясно. Но у меня другая проблема: время для openmp больше, чем для одного потока. Для изображения 8000x5330 операция длится 3,7859 с без openmp и 5,746 с помощью openmp (4 потока). Есть идеи, как улучшить скорость? – user3167262

+0

Я не знаю. Все выглядит хорошо. Возможно, есть ложное разделение, но я не вижу его прямо сейчас. Вы только сделали цикл на параллельных строках, чтобы ни один нить не писал в той же строке. Что такое 'dst.at (y, x)'? Это то же самое, что и dst [width * y + x]? Если вы форматируете текст лучше, вы можете получить больше ответов. Выделите текст и введите ctrl-k, затем исправьте все, что все еще не так. –

0

я надеюсь, что это может помочь u :)

#pragma omp parallel for private (gx, gy, sum) //num_threads (2) 
    for(int y = 1; y < grey.rows - 1; y++){ 
     for(int x = 1; x < grey.cols - 1; x++){  
      gx = xGradient(grey, x, y); 
      gy = yGradient(grey, x, y); 
      sum = abs(gx) + abs(gy); 
      sum = sum > 255 ? 255:sum; 
      sum = sum < 0 ? 0 : sum; 
      dst.at<uchar>(y,x) = sum; 
     } 
    } 
Смежные вопросы