盗我原号的没J8 盗我原号的没J8
关注数: 20 粉丝数: 3,429 发帖数: 47,041 关注贴吧数: 10
(豆知识)连续赋值的比较 #include "stdafx.h" // AMD A4-5300 APU with Radeon(tm) HD Graphics 3.40GHz // 64位的 // 32位win7 // VS2010 优化/O2 const int ARR_SIZE = 1024 * 1024; // 1MB BYTE arr[ARR_SIZE]; void fun1() {   for(int i = 0; i < ARR_SIZE; i++)     arr[i] = 0;   /* 优化成memset   具体实现:   63B101D0 movdqa xmmword ptr [ecx],xmm0 // 移动对齐的双四字   63B101D4 movdqa xmmword ptr [ecx+10h],xmm0   63B101D9 movdqa xmmword ptr [ecx+20h],xmm0   63B101DE movdqa xmmword ptr [ecx+30h],xmm0   63B101E3 movdqa xmmword ptr [ecx+40h],xmm0   63B101E8 movdqa xmmword ptr [ecx+50h],xmm0   63B101ED movdqa xmmword ptr [ecx+60h],xmm0   63B101F2 movdqa xmmword ptr [ecx+70h],xmm0   63B101F7 lea ecx,[ecx+80h]   63B101FD dec eax   63B101FE jne 63B101D0   */ } void fun2() {   int i;   for(i = 0; i < ARR_SIZE - 4; i += 4)   {     arr[i + 0] = 0;     arr[i + 1] = 0;     arr[i + 2] = 0;     arr[i + 3] = 0;   }   for(; i < ARR_SIZE; i++)     arr[i] = 0;   /* 一次1字节   00E61042 mov byte ptr arr (0E63380h)[eax],bl   00E61048 mov byte ptr arr+1 (0E63381h)[eax],bl   00E6104E mov byte ptr arr+2 (0E63382h)[eax],bl   00E61054 mov byte ptr arr+3 (0E63383h)[eax],bl   00E6105A add eax,4   00E6105D cmp eax,0FFFFCh   00E61062 jl wmain+42h (0E61042h)   */ } void fun3() {   for(BYTE* p = arr; p != arr + ARR_SIZE; p++)     *p = 0;   // 同fun1 } void fun4() {   BYTE* p;   for(p = arr; p < (arr + ARR_SIZE - 4); p += 4)   {     p[0] = 0;     p[1] = 0;     p[2] = 0;     p[3] = 0;   }   for(; p != arr + ARR_SIZE; p++)     *p = 0;   /* 一次4字节   00AA1045 mov dword ptr [eax],ebx   00AA1047 add eax,4   00AA104A cmp eax,0BA337Ch   00AA104F jb wmain+45h (0AA1045h)   */ } void fun5() {   BYTE* p;   for(p = arr; p < (arr + ARR_SIZE - 4);)   {     *p++ = 0;     *p++ = 0;     *p++ = 0;     *p++ = 0;   }   for(; p != arr + ARR_SIZE; p++)     *p = 0;   /* 一次2个2字节   00A71050 mov word ptr [eax],0   00A71055 mov word ptr [eax+2],0   00A7105B add eax,4   00A7105E cmp eax,0B7337Ch   00A71063 jb wmain+50h (0A71050h)   */ } void fun6() {   for(int* p = (int*)arr; p < (int*)(arr + ARR_SIZE); p++)     *p = 0;   // 一次4字节   // rep stos dword ptr es:[edi] } LARGE_INTEGER fre, start, end; double dFre; // /ms void PrintProcessTime(void (*fun)()) {   QueryPerformanceCounter(&start);   static const int LOOP_COUNT = 10000;   for(int i = 0; i < LOOP_COUNT; i++)     fun();   QueryPerformanceCounter(&end);   printf("%lf\n", (double)(end.QuadPart - start.QuadPart) / dFre); } int _tmain(int argc, _TCHAR* argv[]) {   //printf("%d\n", (int)arr % 4); // 内存对齐 QueryPerformanceFrequency(&fre);   dFre = (double)fre.QuadPart / 1000.0f; for(int i = 0; i < 4; i++)   {     PrintProcessTime(fun1);     PrintProcessTime(fun2);     PrintProcessTime(fun3);     PrintProcessTime(fun4);     PrintProcessTime(fun5);     PrintProcessTime(fun6);     printf("\n");   } /* 结果   1412.195915   6289.695457   1319.564131   2183.504475   2219.587606   1136.976315 858.889665   3278.518427   864.139788   1757.746345   2220.564310   1230.691314 828.218688   3281.131721   821.887461   1765.655927   2095.254432   1260.054287 1018.454786   3271.004113   846.014493   1729.724568   2089.561066   886.244315   */ return 0; }  
OpenCV的边缘检测(Sobel) 依然是自己改过的教程代码 #include <stdio.h> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" using namespace cv; const char* TITLE = "Sobel Demo - Simple Edge Detector"; Mat g_grad, g_grad_threshold; int g_threshold = 35; void on_trackbar(int pos, void* userdata) {   threshold(g_grad, g_grad_threshold, g_threshold, 255, CV_THRESH_TOZERO);   bitwise_not(g_grad_threshold, g_grad_threshold);   imshow(TITLE, g_grad_threshold); } int main(int argc, char* argv[]) {   // Load an image   Mat src = imread(argv[1]); if(src.data == NULL)   {     printf("Failed to load the image!\n%s\n", argv[1]);     return 1;   }   // Blur (RGB)   //GaussianBlur(src, src, Size(3, 3), 0); // Convert it to gray   Mat src_gray;   cvtColor(src, src_gray, CV_RGB2GRAY); // Blur (gray)   GaussianBlur(src_gray, src_gray, Size(3, 3), 0); // Gradient X   Mat grad_x, abs_grad_x;   Sobel(src_gray, grad_x, CV_16S, 1, 0, 3); // Also try ksize = 1   convertScaleAbs(grad_x, abs_grad_x); // Gradient Y   Mat grad_y, abs_grad_y;   Sobel(src_gray, grad_y, CV_16S, 0, 1, 3); // Also try ksize = 1   convertScaleAbs(grad_y, abs_grad_y); // Total Gradient (approximate)   addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, g_grad); // Late process   threshold(g_grad, g_grad_threshold, g_threshold, 255, CV_THRESH_TOZERO);   bitwise_not(g_grad_threshold, g_grad_threshold);   // Show the image   namedWindow(TITLE, CV_WINDOW_KEEPRATIO);   createTrackbar("threshold", TITLE, &g_threshold, 255, on_trackbar);   imshow(TITLE, g_grad_threshold);   waitKey(0);   //imwrite("D:\\edge.jpg", g_grad_threshold); return 0; }
1 下一页