2012-11-01 4 views
1

이미지를 깊게 복사하고 싶습니다. 어떤 것이 성능면에서 더 낫습니까?딥 복사 cv :: 매트 대체품, 더 낫지 않습니까?

cv::Mat new_img(old_img, true); 

(이 처음이 완전히 정확하지 않습니다, 내 대답을 확인) 또는

cv::Mat new_img = old_img.clone(); 

(두 번째가 포인트 인 측면에서 나에게 더 매력적이기 때문 임 그것을 물어, 하지만 내가 얼마나 더 나빠질 지 모르겠다. 어쩌면 나는 심지어 상수를 정의 할 수도있다.

+0

벤치 마크를 시도해 보셨습니까? 일반적으로 같은 줄에서 선언하고 정의하는 것은 컴파일러가 – alestanis

+0

을 아직 최적화하지 못하는 것입니다. 나는 다른 질문을 읽고 있었고 나는 딥 복사 생성자에 대해서 알게되었다. 나는 내가 여기에서 보았던 전문가로부터의 빠른 대답을 희망하고 있었다. :)하지만 다양한 크기의 컴퓨터에서 설문 조사를 할 것입니다. –

답변

4

source code을 보면 정확히 무엇을 볼 수 있는지 알 수있다. 생성자는 00172이고 복제본은 00346입니다. 두 함수 모두 동일한 내부 함수 copyTo를 호출하므로 성능 측면에서 본질적으로 동일하다고 상상합니다.

+0

hm. 나는 여기서'copyTo'가 무거운 작업이라는 것을 이해합니다. 다른 한편으로는, 두 번째 것이 기본 구성을 먼저 수행하지 않는다면, 복제는 새로운 이미지를 만들 것입니다. 두 개의 이미지가 위아래로 반복 될 것입니다 ...? 10x10이라고하는 작은 이미지의 차이를 만들 수 있습니까? 또는 지금 그것은 단지 원자를 분할하는 것입니다. –

+0

아, 그리고 코드베이스에 대한 thx! 어제 그걸 좋아해. –

+0

맞습니다. 생성자에서 더 많은 일이 발생하는 것 같습니다. 나는 둘 사이의 차이에 대해 구체적으로 알지 못하지만 측정 가능한 차이를 발견 할 수 있다면 매우 놀랄 것입니다. 자유롭게 시험해보십시오. (1x1부터 시작합니다.) 찾으면 하나만 올리십시오. – Hammer

0

나는 벤치마킹을 시작했고 ... 계속 기다려! 이

cv::Mat(const cv::Mat& from, bool deep_copy=false); 

무엇 해머 같은 것은없고 내가 본을했다 : 호기심

cv::Mat(const CvMat* from, bool deep_copy=false); 

...

그래서 올바른 해결책은

CvMat temp = img; 
cv::Mat img_clone = cv::Mat(&temp, true); 
// vs 
img_clone = img.clone(); 

후에 것 작은 이미지에서 프로파일 링 : 해머 (Hammer)가 말한 것과는 차이가 없다. 그들은 복제를하지 않는 이유 copyCtor는 반환 값 최적화입니다 (위키 백과 참조).

+0

당신이 맞습니다, 나는 잘못된 지점을 가리켰다. 실제 생성자는 00109에있다. 미안하다. – Hammer

+0

미안하다. 대답은 훌륭했다. 나의 질문은 틀렸다;) 그리고 복사 생성자는 다음과 같다. 얕은, 깊은 복사본 ctor가 없습니다. –

+0

당신은 다시 옳습니다! 나는 그 물건들을 조심스럽게 읽을 수 없다. – Hammer

관련 문제